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類?
我想知道這是爲什麼。我的假設是接口被忽略,因爲它們太複雜了。它們沒有共同的超類型,每個類都可以實現多個接口,所以類/接口層次結構太複雜,無法有效地進行搜索?
除了這個原因,我被困住了。有人知道嗎?!
啊,我明白了。 如果沒有Test的子類實現了Collection,我仍然期望Downcast失敗(類似於如果沒有找到該類型,只在嚴格類的層次結構中失敗)。那是因爲不值得付出努力? – 2009-08-05 19:04:59
編譯器無法對類子類進行任何假設。除非該類被標記爲'final',否則可以使用它的類文件對其進行子類化。 – notnoop 2009-08-05 19:08:59
換句話說,僅僅因爲在編譯時沒有子類,並不意味着在運行時不能有子類。 – notnoop 2009-08-05 19:09:38