我的问题与Java语言有关。 这就是我得到的:
interface I1{}
interface I2{}
class C1 implements I1{}
class C3 extends C1 implements I2{}
何时
C1 01;
C3 o3;
I1 i1;
等
现在事实证明I2 i2 = (I2) i1;
是正确的,因为在运行时i1实际上是指一个实现I2的对象。
但我不明白。接口彼此之间没有关系,那么如何将它转换为相邻接口呢?
没有更多的代码,它只是一个钻孔,以准备Java认证。
最好的问候
答案 0 :(得分:3)
如果将Integer
转换为String
,编译器可以将其视为非法,但是,由于类可以实现各种接口,编译器无法知道您是否正在进行交换当您将一种界面类型转换为另一种界面时请考虑以下代码:
I1 i1 = getI1();
if (i1 instanceof I2) {
I2 i2 = (I2) i1;
}
如果Java编译器不允许从一个接口转换为另一个接口,那么这段完全合法的代码将无法编译。
答案 1 :(得分:2)
I2 i2 = (I2) i1;
表示:我知道i1
引用的对象的具体运行时类型实现了I2
接口,因此我想将其引用为I2
。如果i1
的具体运行时类型确实实现了I2
,则转换将成功。
I1
和I2
没有任何共同点这一事实并不重要。重要的是i1
引用的对象的实际具体运行时类型。
答案 2 :(得分:1)
你自己回答了问题; - )
"[... ]is right because at run time i1 actually refers to an object that implements I2"
Typecasts在运行时评估,而不是在编译时评估。因此,如果i1
在运行时指向的对象是I2
类型,则没有错误。
答案 3 :(得分:1)
简单地说,界面是一种类型,如鸟 - 不是鹰或鸭。 采取这些类的具体实现(这是相当愚蠢的,但请耐心等待)
interface Bird {fly();}
interface Swimmer {swim();}
class Eagle implements Bird {fly(){...};}
class Duck extends Eagle implements Swimmer {swim(){...};}
Swimmer i2 = (Swimmer) i1;
这意味着您的代码认为i1是一个可以游泳的实体。如果i1是鸭子,这个代码将起作用,如果它是一只老鹰,这将失败。类型转换是在运行时而不是编译时完成的。