2015-12-08 83 views
2

MyInt.java:从接口实例分配一个对象到另一接口实例

interface Outer{ 
    void ofoo(); 
    interface Inner { 
     void ifoo(); 
    } 
} 

MyClass.java:

class MyInfClass implements Outer, Outer.Inner{ 
    int x; 
    public void ofoo{ 
     // 
    } 
    public void ifoo{ 
     // 
    } 
} 

class MyClass{ 
    void testFoo(){ 
     Outer obj = new MyInfClass(); 
     Inner iObj; 
     //iObj = obj; Tried this and got compilation error 
//Out of wild guess I tried the following 
     iObj = (MyInfClass) obj; //Runs Successfully 
     iObj.ifoo(); 
    } 
} 

定义此行为和是它适用于其它情形一样

Interface interfaceRef = new SubClass(); // SubClass implements the Interface 
SuperClass superClassRef = (SubClass) interfaceRef; 

是否有任何其他正确的方法来做到这一点?

+1

创建对象时,最好的办法是使用类名称。没有必要进行类型检查和转换:您知道该对象是什么类型。你创造了它。 – xmjx

回答

2

一般的解决方法是使用更普遍的interface只有当它不会破坏其他代码。在你的情况下,使用Outer接口会破坏事物,因此请使用实际的类。

interface Outer { 

    void ofoo(); 

    interface Inner { 

     void ifoo(); 
    } 
} 

class MyInfClass implements Outer, Outer.Inner { 

    int x; 

    @Override 
    public void ofoo() { 
     // 
    } 

    @Override 
    public void ifoo() { 
     // 
    } 
} 

public void test() { 
    MyInfClass mic = new MyInfClass(); 
    Outer obj = mic; 
    Outer.Inner iObj = mic; 
} 
2
iObj = obj; 

因为Outer不是Inner子接口不通过编译。

iObj = (MyInfClass) obj; 

经过编译因为MyInfClass实现Inner,所以MyInfClass参考可以被安全地分配给Inner变量。

但是,做出这样的分配最安全的方式是铸造之前测试的obj类型:

if (obj instanceof Inner) 
    iobj = (Inner) obj; 
+0

这是否可以应用于类似的场景? – Sab

+0

@Sab什么情况? – Eran

+0

像这样'Interface interfaceRef = new SubClass(); // SubClass实现接口 SuperClass superClassRef =(SubClass)interfaceRef;' – Sab