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;
还有其他正确的方法吗?
答案 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;
}