Java 将对象从一个接口实例分配给另一个接口实例
MyInt.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
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
测试类型。创建对象时,最好使用类名。不需要进行类型检查和转换:您知道该对象是什么类型。是你创造的。