2009-08-05 59 views
4
import java.util.Collection; 


public class Test 
{ 
    public static void main(String[] args) 
    { 
     Collection c = null; 
     Test s = null; 

     s = (Test) c; 
    } 
} 

在上面的代碼示例中,我將一個集合對象轉換爲Test對象。 (忽略空指針)。測試有沒有與Collection的關係,但是這個程序將通過所有編譯時檢查。爲什麼我們可以將Java接口轉換爲* any *非final類?

我想知道這是爲什麼。我的假設是接口被忽略,因爲它們太複雜了。它們沒有共同的超類型,每個類都可以實現多個接口,所以類/接口層次結構太複雜,無法有效地進行搜索?

除了這個原因,我被困住了。有人知道嗎?!

回答

8

「非最終」是這裏的一個關鍵詞。您可能有另一個類

public class Test2 extends Test implements Collection 

,其實例將最終被分配到s使鑄造完全合法的。

+0

啊,我明白了。 如果沒有Test的子類實現了Collection,我仍然期望Downcast失敗(類似於如果沒有找到該類型,只在嚴格類的層次結構中失敗)。那是因爲不值得付出努力? – 2009-08-05 19:04:59

+0

編譯器無法對類子類進行任何假設。除非該類被標記爲'final',否則可以使用它的類文件對其進行子類化。 – notnoop 2009-08-05 19:08:59

+0

換句話說,僅僅因爲在編譯時沒有子類,並不意味着在運行時不能有子類。 – notnoop 2009-08-05 19:09:38

3

因爲Test的子類也可能是Collection的子類型!語言規範的設計有點靈活,可以允許在運行時進行驗證。

相關問題