簡體   English   中英

通配符和原始類型轉換有什么區別?

[英]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.

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