2017-10-07 159 views
-2

我有三个类。为什么这个java casting失败

Person <-- Student <-- GradStudent,其中<--手段延伸(即GradStudent扩展学生,学生扩展人)

Person person = new Student(); // this is perfectly legal

GradStudent gradStudent = (GradStudent) person; 
System.out.println(gradStudent); // java.lang.ClassCastException here 

为什么?我们的变量是一个学生,我们可以做学生s =新的GradStudent(),为什么这不起作用?

同样的,如果我这样做

Student student = new Student(); 
GradStudent aGradStudent = (GradStudent) student; 
System.out.println(aGradStudent); // same error here 

我们为什么能做到学生S =新GradStudent(),但我们不能做学生学生=新的学生(),然后GradStudent aGradeStudent =( GradStudent)学生

+0

Java中始终允许向上转换,它是隐式的,也是因为子类与尊重替换原则的子类型不同。 – BetaRunner

回答

1

这是因为它不是安全地说,PersonStudent每个实例也是GradStudent一个实例。但GradStudentStudent的每个实例也是Person的实例。
您总是可以抽象到更高级别的层次结构,但不能在其他方向上抽象。

+0

我不明白的是,如何演绎任何不同于声明'Student student = new GradStudent()'? –

+0

因为这是一个具有静态类型Student和动态类型GradStudent的声明。有关更多详细信息,请参阅Java中的动态分派。 – BetaRunner

+1

在这种情况下,它不是:你可以做'学生学生=新的GradStudent(); **和**可以施加'学生学生=(学生)gradStudent;'。但是后者是没有意义的,因为你不需要这样的表演。每个'GradStudent' **都是**学生。没什么可施展的。 – mumpitz