2017-10-07 82 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