4

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

interface I1{}
interface I2{}
class C1 implements I1{}
class C3 extends C1 implements I2{}

什么时候

     C1 01;
     C3 o3;
     I1 i1;

ETC

现在事实证明这I2 i2 = (I2) i1;是正确的,因为在运行时 i1 实际上是指实现 I2 的对象。但我不明白。接口之间没有任何关系,那么如何将其转换为相邻的接口呢?没有更多的代码,它只是为了准备Java认证的练习。此致

4

4 回答 4

4

如果您将 an强制转换Integer为 a String,编译器可以将其视为非法的,但是,由于一个类可以实现多种接口,因此当您将一种接口类型强制转换为另一种时,编译器无法知道您是否违规。考虑这段代码:

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

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

于 2012-11-04T14:09:39.613 回答
2

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

I1I2没有共同点的事实并不重要。重要的是 . 引用的对象的实际具体运行时类型i1

于 2012-11-04T14:01:40.347 回答
1

你自己回答了这个问题;-)

"[... ]is right because at run time i1 actually refers to an object that implements I2"

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

于 2012-11-04T14:03:09.693 回答
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 是鸭子,此代码将起作用,如果它是鹰,则此代码将失败。类型转换是在运行时而不是编译时完成的。

于 2012-11-04T14:09:15.633 回答