使用Java进行转换(接口和类)

时间:2015-01-03 21:20:04

标签: java inheritance casting polymorphism

如果:

interface I{}

class A implements I{}

class B extends A{}

class C extends B{}

A a = new A();
B b = new B();

Why a = (B)(I)b; is correct
but b = (B)(I)a; is false?

我发现施法很混乱,如果我可以向下施放或向上施放物体,最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

您的类层次结构如下所示:

C -> B -> A -> I

如果x的运行时类型是Y的子类,则对象x可以转换为类Y。或者,换句话说,如果存在从运行时类型xY的路径。通过"运行时类型"我指的是对象的类型(构造对象时使用的对象)而不是变量类型(变量声明中的那个)。

这是有效的:

b = new B();
(B)(I)b;

b中存储的对象的类型为B。它已转换为I,然后返回BB是它们的子类。施展到I实际上并没有做任何事情,只是为了让你迷惑。

然而,这些都不是有效的:

a = new A();
(B)(I)a;
(B)a;

他们都会失败,例外:java.lang.ClassCastException: A cannot be cast to Ba的类型A不是B的子类。 AB之间存在关系,但它的方向相反 - BA的子类。

有关详细说明,请参阅此处:http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

答案 1 :(得分:1)

在编码样本中回答问题唯一相关的内容如下:

class B extends A{}

这意味着B是A的子类。子类可以转换为超类类型,但超类不能转换为子类类型。

因此,A无法转换为B类。

为什么呢?以这种方式思考逻辑:

enter image description here是一种Programming_language,但Programming_language不是enter image description here

的类型