public class A {
}
public class B extends A {
}
public class C extends A {
}
public class D extends B {
}
public class E extends D {
}
给定的层次结构是这样的。问题是:
1- A a = (D) new B();
Runtime error (B cannot cast to D)
2- A a = (D)((B)new E());
No error
我不明白为什么会出现这些情况,当我们转换具体类时,如果没有该类的特定引用类型,我们应该怎么想?
如果这些问题是这样的话,我可以回答:
B b = new B();
((D)b).someMethod();
它会给出一个ClassCastException
。但我在上面的例子中想不到这样,因为没有引用类型。谢谢!
答案 0 :(得分:3)
实际上这很容易:
class Bird;
class FlyingBird extends Bird;
class Eagle extends FlyingBird;
class Penguin extends Bird;
像
这样的东西((Eagle)new Penguin()).fly();
根本不计算
答案 1 :(得分:1)
考虑一下:
你说的是: Animal x = (Turtle) new Dog();
只是因为
Animal x = new Dog();
和
Animal z = new Turtle();
并不意味着可以将一只乌龟变成一只狗或狗变成一只乌龟,如果可能的话,这不是继承如何运作然后你可以把一只乌龟变成狗并让它变成树皮
答案 2 :(得分:0)
取消装箱时,第1部分(直接投射失败,间接投射成功)的情况可能发生:
Number i = 123; // Autoboxed
double d1 = (double)i; // Runtime error
double d2 = (double)((int)i); // Works fine
直接投射失败,因为无法将int
直接取消装箱到double
。
然而,间接投射成功,因为i
可以取消装箱到int
,然后int
可以投放到double
。