Java 界面间的转换

Java 界面间的转换,java,interface,casting,Java,Interface,Casting,我的问题与Java语言有关。 这就是我得到的: interface I1{} interface I2{} class C1 implements I1{} class C3 extends C1 implements I2{} 什么时候 等 现在证明,i2i2=(I2)i1是正确的,因为在运行时i1实际上引用了实现I2的对象。 但我不明白。接口之间没有关系,因此如何将其转换到相邻接口? 这里没有更多的代码,只是为了准备Java认证而进行的一次演练。 致以最诚挚的问候I2 I2=(I2)i1的

我的问题与Java语言有关。 这就是我得到的:

interface I1{}
interface I2{}
class C1 implements I1{}
class C3 extends C1 implements I2{}
什么时候

现在证明,
i2i2=(I2)i1
是正确的,因为在运行时i1实际上引用了实现I2的对象。 但我不明白。接口之间没有关系,因此如何将其转换到相邻接口? 这里没有更多的代码,只是为了准备Java认证而进行的一次演练。 致以最诚挚的问候

I2 I2=(I2)i1
的意思是:我知道
i1
引用的对象的具体运行时类型实现了
I2
接口,所以我想将其作为
I2
引用。如果具体的运行时类型
i1
确实实现了
I2
,则转换将成功


事实上,
I1
I2
没有共同点并不重要。重要的是由
i1

引用的对象的实际具体运行时类型,您自己回答了这个问题;-)


类型转换是在运行时而不是在编译时进行计算的。因此,如果运行时
i1
指向的对象是
I2
类型,则没有错误。

简单地说,接口是一种类型,就像鸟,而不是鹰或鸭。 以这些类的具体实现为例(这相当愚蠢,但请容忍我)


这意味着您的代码相信i1是一个可以游泳的实体。如果i1是一只鸭子,这段代码将工作,如果它是一只鹰,这段代码将失败。类型转换是在运行时而不是编译时完成的。

如果将
整数
转换为
字符串
,编译器可以将其视为非法而停止,但是,由于类可以实现各种接口,因此当您将一种接口类型转换为另一种接口类型时,编译器无法知道您是否正在进行转换。考虑这个代码:

I1 i1 = getI1();
if (i1 instanceof I2) {
  I2 i2 = (I2) i1;
}

如果Java编译器不允许从一个接口转换到另一个接口,那么这段完全合法的代码将无法编译。

在您的代码中,即使接口之间没有任何直接关系,通过实现它们的类,它们之间确实存在关系。
i1
变量声明在哪里?请发布i1变量的声明。完整的代码片段会更有用。@techfoobar如果您试图将I1类型的expr强制转换为I2类型,则这种关系是不相关的。运行时值类型没有在这里输入公式。类也声明类型,而不仅仅是接口。是的-我试图过度简化(并在答案中加入了游泳鸭)。这个问题似乎已经得到了回答。
"[... ]is right because at run time i1 actually refers to an object that implements I2"
interface Bird {fly();}
interface Swimmer {swim();}
class Eagle implements Bird {fly(){...};}
class Duck extends Eagle implements Swimmer {swim(){...};}

Swimmer i2 = (Swimmer) i1;
I1 i1 = getI1();
if (i1 instanceof I2) {
  I2 i2 = (I2) i1;
}