簡體   English   中英

警告不必要與泛型集合?

[英]Warning unnecessary with generic collections?

我不知道為什么Java編譯器不信任這一行代碼:

List<Car> l = new ArrayList();

並期望有一個類型化的ArrayList:

List<Car> l = new ArrayList<Car>();

確實,編譯器在第一種情況下指示未經檢查的分配。

為什么編譯器沒有看到此ArrayList()剛剛被創建,因此無法在其中找到“ Car”以外的其他對象?

如果未類型化的ArrayList是在以前創建的,但在這種情況下沒有創建,則此警告才有意義。

實際上,由於List的類型為“ Car”,因此僅當“ object”為“ Car”時,才允許所有期貨“ l.add('object')”。 =>因此,根據我的說法,不會發生任何意外。

我錯了嗎 ?

謝謝

為什么編譯器沒有看到此ArrayList()剛剛被創建,因此無法在其中找到“ Car”以外的其他對象?

簡單的答案是“因為不允許這樣做”。

編譯器必須實現Java語言規范。 如果某個編譯器編寫者去編譯器添加了很多技巧,以使“每個人”都知道是安全的,那么他實際上所做的就是引入可移植性問題。 使用笨拙的(或更准確地說,嚴格符合標准的)Java編譯器進行編譯時,使用此編譯器編譯和測試的代碼將產生編譯錯誤。

那么,JLS為什么不允許這樣做? 我可以想到一些可能的解釋:

  • JLS編寫者沒有時間將其添加到規范中。 例如,考慮本規范其余部分的所有分支。
  • JLS編寫者無法在規范中找到表達這種聲音的合理方法。
  • JLS編寫者不想在規范中加入他們不確定在現實世界中的編譯器中是否可以實現的規范……而不會給編譯器編寫者帶來太多負擔。

然后還有一個相關的問題,即編譯器是否可以實現這種檢查。 我沒有資格回答這個問題……但是我對這個問題了解得足夠多,以至於認識到它不一定像人們想象的那么簡單。

要添加到Stephen C的非常好的答案(主要是因為將其作為注釋編寫起來確實很麻煩,很抱歉),實際上在JLS中明確提到了此問題:

討論區

可以從任何類型的參數實例的值中分配原始類型的變量。

例如,可以根據子類型化規則(第4.10.2節)將Vector<String>分配給Vector<String>

從Vector到Vector<String>的反向分配是不安全的(因為原始向量可能具有不同的元素類型),但是仍然允許使用未經檢查的轉換(第5.1.9節),以便實現與舊代碼的接口。 在這種情況下,編譯器將發出未經檢查的警告。

為什么他們在這種特殊情況下沒有特殊情況? 因為不必為實現添加特殊情況,而不必這樣做,並且“正確的”解決方案不會添加任何特殊的問題(除了一些寫作工作,他們認為這不太重要) 。

同樣,每種特殊情況都意味着編譯器會變得更加復雜(至少可以說,在這種情況下當然也是如此)-考慮到javac整體上有多么簡單,我想擁有一個簡單,快速的編譯器也是不二之選。設計目標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM