当引用类型不存在时进行转换

时间:2017-05-23 18:13:30

标签: java casting

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。但我在上面的例子中想不到这样,因为没有引用类型。谢谢!

3 个答案:

答案 0 :(得分:3)

实际上这很容易:

class Bird; 

class FlyingBird extends Bird;

class Eagle extends FlyingBird;

class Penguin extends Bird;

这样的东西
((Eagle)new Penguin()).fly(); 

根本不计算

答案 1 :(得分:1)

考虑一下:

enter image description here

你说的是:

 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