1

考虑 Java 中的以下类:

interface I{
}
class A implements I{
}

class B extends A {
}

class C extends B{
}
And the following declarations:
A a = new A();
B b = new B();

获得a = (B)(I) b;代码后,将编译并运行。而且完全不明白为什么我需要转换为接口和 B 类。在我看来,如果没问题,它会起作用a = b;。有人可以向我解释上述显式转换的逻辑是什么使代码运行良好。

但是一旦你有了I i = (C) a;它就会在运行时失败,因为'a'不指向C类的对象。为什么'a'需要指向C类的对象?除此之外,我不明白转换为 C 类的逻辑。无论如何,您将参考 I 接口。最好的祝福

4

2 回答 2

2

仅当转换的对象确实扩展了此类或实现了此接口时,才有可能将对象转换为给定的类或接口。如果不是(即,如果对象不是类或接口的实例),您将获得 ClassCastException。请注意,将对象转换为类不会更改对象的类型。它只允许将其引用为另一种类型,它也是,扩展或实现。

让我们看看你的例子:

a = (B)(I) b;

这首先强制转换b类型为的对象B。到界面I。这没关系,因为 B 扩展了 A,而 A 实现了 I,这意味着 B 也实现了 I。

然后它第二次将同一个对象投射到类Bb是 的一个实例B,所以这行得通。

I i = (C) a;

a这将类型的对象转换A为类C。A不扩展C,所以这是不可能的。

于 2012-10-12T11:29:20.303 回答
0

Java 中引用类型的转换只是程序员的自检符号。该类型的变量仅保存对对象的引用(指针)。在强制转换期间,引用本身和被引用对象都不会发生变化。实际上,这种铸造什么也没做。

只有在将宽类型变量分配给窄类型变量时才需要进行自检。例如从超类到子类。因为只有在这里才有可能出错。从相等类型的变量或窄类型的变量分配时,不需要检查,因为它总是可能的。

于 2012-10-12T11:30:07.507 回答