Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将对象从一个接口实例分配给另一个接口实例_Java - Fatal编程技术网

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

Java 将对象从一个接口实例分配给另一个接口实例,java,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 MyC

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; 
还有其他合适的方法吗

iObj = obj;
未通过编译,因为
外部
不是
内部
的子接口

iObj = (MyInfClass) obj;
通过编译,因为
MyInfClass
实现了
internal
,因此可以将
MyInfClass
引用安全地分配给
internal
变量

然而,进行此类分配的最安全方法是在铸造之前测试
obj
的类型:

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

一般的解决方案是只在不破坏其他代码的情况下使用更通用的
接口。在您的情况下,使用
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;
}

这是否可以应用于类似的场景?例如
接口ref=new SubClass();//子类实现接口超类superClassRef=(子类)interfaceRef
@Sab是的,您可以这样做,但是在执行此类类型转换之前,您应该始终使用
instanceof
测试类型。创建对象时,最好使用类名。不需要进行类型检查和转换:您知道该对象是什么类型。是你创造的。