将对象从接口实例分配给另一个接口实例

时间:2015-12-08 10:33:48

标签: java

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; 

还有其他正确的方法吗?

2 个答案:

答案 0 :(得分:2)

iObj = obj;

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

iObj = (MyInfClass) obj;

通过编译,因为MyInfClass实现了Inner,因此可以将MyInfClass引用安全地分配给Inner变量。

然而,做出此类任务的最安全方法是在投射前测试obj的类型:

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

答案 1 :(得分: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;
}