如果:
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?
我发现施法很混乱,如果我可以向下施放或向上施放物体,最好的方法是什么?
答案 0 :(得分:1)
您的类层次结构如下所示:
如果x
的运行时类型是Y
的子类,则对象x
可以转换为类Y
。或者,换句话说,如果存在从运行时类型x
到Y
的路径。通过"运行时类型"我指的是对象的类型(构造对象时使用的对象)而不是变量类型(变量声明中的那个)。
这是有效的:
b = new B();
(B)(I)b;
b
中存储的对象的类型为B
。它已转换为I
,然后返回B
。 B
是它们的子类。施展到I
实际上并没有做任何事情,只是为了让你迷惑。
然而,这些都不是有效的:
a = new A();
(B)(I)a;
(B)a;
他们都会失败,例外:java.lang.ClassCastException: A cannot be cast to B
。 a
的类型A
不是B
的子类。 A
和B
之间存在关系,但它的方向相反 - B
是A
的子类。
有关详细说明,请参阅此处:http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
答案 1 :(得分:1)
在编码样本中回答问题唯一相关的内容如下:
class B extends A{}
这意味着B是A的子类。子类可以转换为超类类型,但超类不能转换为子类类型。
因此,A无法转换为B类。
为什么呢?以这种方式思考逻辑:
是一种
Programming_language
,但Programming_language
不是