2015-11-04 42 views
0

爲什麼我們可以從一個超類垂下來,像這樣子類:在Java中向下轉換類與向下轉換接口的區別?

Object o = getStringObject(); 
String str = (String) o; 

但然後用同樣的原理DOWN投的接口,一個子類如α-

InterfaceType anInterface; 
anInterface = (InterfaceType) SubClassVar; 

所以實施例1都很好,很花哨。我不明白的是,如果一個接口是一個實現它的類的超類型,那麼當我們向該接口下傳類時,如果接口的層次更高,我們怎麼會沒有ClassCastException?我在某處讀到,通過類和界面進行投射是有區別的,但當然他們不想解釋爲什麼,所以我仍然公開。謝謝,Stack!

+2

我很困惑。你是說'SubClassVar'是一個'InterfaceType'?那麼演員陣容沒有用處。 –

+0

@SotiriosDelimanolis SubClassVar是一個類實現InterfaceType – 3alto

+0

@SotiriosDelimanolis也許我需要更多的信息,但如果你爲android開發,這是溝通模式,用於交談活動和片段之間。 – 3alto

回答

2

從技術上說,您已經上傳到接口,因爲它在層次結構中比該接口的(推測的)實現者更高,SubClassVar。此外,這種轉換甚至是不需要的,因爲無論如何都可以通過該接口來討論接口的實現,而無需強制轉換語法。

您可以可以向下傾斜一個接口,就像您對子類所做的那樣。這裏有一個例子:當程序員顯式轉換一個類型到另

interface I1 {} 
interface I2 extends I1 {} 

class I2Impl implements I2 {} 

class Main { 
    public static void main(String[] args) { 
     I1 test = new I2Impl(); 
     I2 test2 = (I2)test; 
     I2Impl test3 = (I2Impl) test2; 
    } 
} 
0

,它通常是因爲程序員知道更多有關運行時類型比編譯器的對象。編譯器可以選擇允許任何投射,因爲聰明的程序員這樣說。然而,作爲Java,編譯器會試圖捕捉並防止明顯的錯誤。

不允許在兩種類型之間進行強制轉換,如果很明顯沒有對象可以同時屬於這兩種類型;換句話說,這兩種類型的交集是空的。例如,我們不能在StringInteger之間投射;也不是StringRunnable。但是,NumberRunnable可以互相投射,因爲可以想象這兩種類型都可能有對象。

另外,只有A和B可以相互轉換時,才能使用同一比較a==b。如果編譯器知道它們不能是同一個對象,則不允許==。請參見JLS

確切的算法非常複雜 - http://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.5.1請注意,該算法是對稱的 - 當且僅當B可以投射到A時,A才能投射到B.規範的文本不是很好,可能包含錯誤(見question

「downcast」是目標類型是子類型時; 「上傳」是目標類型是超類型的時候。上傳通常是不必要的,但在需要時有cases