爲什麼可以將MyClass
對象投射到List<MyClass>
而沒有編譯錯誤(只是「未選中」警告),儘管MyClass
沒有實現List接口,同時也是不可能的例如,String
類以相同的方式投射。Java:將MyClass投射到列表<MyClass>
謝謝。
爲什麼可以將MyClass
對象投射到List<MyClass>
而沒有編譯錯誤(只是「未選中」警告),儘管MyClass
沒有實現List接口,同時也是不可能的例如,String
類以相同的方式投射。Java:將MyClass投射到列表<MyClass>
謝謝。
如果轉換完全不可能,編譯器將創建編譯器錯誤。但是當你投射到一個界面(並且你的原始類不是final
)時,這個投射就有可能成功。
儘管它可能不存在,但對於尚未寫入子類MyClass
並實施List
的類,即使這對我們沒有意義也是可能的。
由於這種可能性,編譯器必須允許該轉換。但是如果沒有這樣的子類,這在運行時仍然會導致ClassCastException
。
的JLS, Section 5.5.1,狀態鑄造時S
到T
:
如果T是一個接口類型:
如果S不是最終類(§8.1.1)那麼如果存在T的超類型X和S的超類型Y,使得X和Y都是可證明的不同參數化類型,並且X和Y的刪除相同,則會發生編譯時錯誤。
否則,在編譯時鑄件總是合法的(,因爲即使S沒有實現T,S的子類可能爲)。
如果S是最終類(第8.1.1.1節),那麼S必須實現T,否則會發生編譯時錯誤。
(粗體重點煤礦)
哦,怎麼樣我可以忘記子類(-_-),謝謝 – 2015-03-30 18:17:11
你能發佈一些代碼演示這一點?我不是一個Java專家,但你是在說這是關於**所有**類的一般聲明,還是僅僅是「MyClass」? – 2015-03-30 18:16:44
請參閱http://stackoverflow.com/questions/27747562/unexpected-type-safety-violation – 2015-03-30 18:18:48
@WaiHaLee, 因爲它在_rgettman_的回答結果,它是關於非終級類 – 2015-03-30 18:51:41