在 Java 中,了解在泛型中使用通配符的限制至關重要。讓我們深入研究為聲明為List 的List 添加元素的具體問題extends Number>:
List<? extends Number> foo3 = new ArrayList<Integer>();
當您嘗試在foo3 中加入整數時,您可能會遇到類似以下內容的錯誤:
The method add(capture#1-of ? extends Number) in the type List<capture#1-of ? extends Number> is not applicable for the arguments (ExtendsNumber)
通配符 ?擴充清單中的數字 foo3 表示 foo3 可以儲存擴充 Number 的一系列類型的值。這意味著以下分配都是有效的:
List<? extends Number> foo3 = new ArrayList<Number>(); // Number extends Number List<? extends Number> foo3 = new ArrayList<Integer>(); // Integer extends Number List<? extends Number> foo3 = new ArrayList<Double>(); // Double extends Number
但是,鑑於這種靈活性,不可能確定地確定可以添加到 foo3 中而不違反其完整性的物件類型。禁止加入 Integer,因為 foo3 可能指向 List
本質上,List保證你只能從中讀取並且會得到一個 T 或 T 的子類別。由於你不能保證清單的具體類型,所以你不能安全地添加到它。
相較之下,List< ;?超級T>允許您新增類型 T 或其子類別的值,因為您可以確定清單可以保存這些值而不違反其類型安全性。
考慮Collections.copy() 的簽名:
public static <T> void copy(List<? super T> dest, List<? extends T> src)
注意src 的通配符(? extends T) 如何允許你傳遞保存類型T 或其子類別的值的任何列表,保證src 產生的值將是類型T 或其子類別。這使得該方法能夠處理各種清單類型,安全地複製值。
了解使用泛型通配符的限制對於編寫健全的 Java 程式碼至關重要。請記住,您無法添加到列表因為你不能保證它所指向的清單的具體類型。相反,您只能從中讀取並確保取得 T` 類型或其子類別的值。
以上是為什麼我無法將元素添加到列表中的詳細內容。更多資訊請關注PHP中文網其他相關文章!