2015-03-30 99 views
0

爲什麼可以將MyClass對象投射到List<MyClass>而沒有編譯錯誤(只是「未選中」警告),儘管MyClass沒有實現List接口,同時也是不可能的例如,String類以相同的方式投射。Java:將MyClass投射到列表<MyClass>

謝謝。

+1

你能發佈一些代碼演示這一點?我不是一個Java專家,但你是在說這是關於**所有**類的一般聲明,還是僅僅是「MyClass」? – 2015-03-30 18:16:44

+0

請參閱http://stackoverflow.com/questions/27747562/unexpected-type-safety-violation – 2015-03-30 18:18:48

+1

@WaiHaLee, 因爲它在_rgettman_的回答結果,它是關於非終級類 – 2015-03-30 18:51:41

回答

3

如果轉換完全不可能,編譯器將創建編譯器錯誤。但是當你投射到一個界面(並且你的原始類不是final)時,這個投射就有可能成功。

儘管它可能不存在,但對於尚未寫入子類MyClass並實施List的類,即使這對我們沒有意義也是可能的。

由於這種可能性,編譯器必須允許該轉換。但是如果沒有這樣的子類,這在運行時仍然會導致ClassCastException

JLS, Section 5.5.1,狀態鑄造時ST

  • 如果T是一個接口類型:

    • 如果S不是最終類(§8.1.1)那麼如果存在T的超類型X和S的超類型Y,使得X和Y都是可證明的不同參數化類型,並且X和Y的刪除相同,則會發生編譯時錯誤。

      否則,在編譯時鑄件總是合法的(,因爲即使S沒有實現T,S的子類可能爲)。

    • 如果S是最終類(第8.1.1.1節),那麼S必須實現T,否則會發生編譯時錯誤。

(粗體重點煤礦)

+0

哦,怎麼樣我可以忘記子類(-_-),謝謝 – 2015-03-30 18:17:11

相關問題