[英]What is the difference between wildcard and raw types casts?
以下有什么區別?
List <?> list = (List<?>) var;
List <String> list = (List) var;
從本質上講,不同之處在於,一個使您的代碼類型安全,一個使其類型不安全。
如果你轉換為原始類型,如(List)var
,你基本上放棄了泛型提供的安全性。 var
可以是List<Integer>
,現在你已經將它轉換為了它,你可以將它分配給List<String>
而不需要編譯器抱怨。 你甚至可以在沒有編譯器抱怨的情況下從中獲取字符串(應該是List<Integer>
)(但這會在運行時拋出異常)。 因此,轉換為原始類型就像對編譯器說:
我現在還不確切知道這是什么類型的列表,但我會在運行時完成。 我可以一次性掌握所有這些變量的所有類型信息,所以你不必擔心它! 我會自己處理類型。
...如果編譯器已經可以為您完成,那么這不是明智之舉。 人類往往會犯錯誤。
轉換為(有界)通配符就像對編譯器說:
我現在還不確切知道這是什么類型的列表,但我會在運行時完成。 我不能同時掌握所有這些變量的所有這些類型的信息,所以當我正在做的事情一直不能成功時,你必須給我一個錯誤,好嗎?
在這種情況下,編譯器知道您不知道泛型參數,因此不允許您執行某些操作,例如將String
添加到List<?>
,因為?
可能是Integer
。 你仍然可以從List<?>
獲取Object
,因為無論如何?
是的,它必須是Object
的子類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.