首頁 > Java > java教程 > 為什麼我無法將元素添加到列表中

為什麼我無法將元素添加到列表中

Susan Sarandon
發布: 2024-12-18 09:05:10
原創
614 人瀏覽過

Why Can't I Add Elements to a List

理解列表資料結構

在 Java 中,了解在泛型中使用通配符的限制至關重要。讓我們深入研究為聲明為List 的List 添加元素的具體問題extends Number>:

List<? extends Number> foo3 = new ArrayList<Integer&gt();
登入後複製

當您嘗試在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。同樣,禁止添加 Double,因為 foo3 可能引用 List

抽象的保證

本質上,List保證你只能從中讀取並且會得到一個 T 或 T 的子類別。由於你不能保證清單的具體類型,所以你不能安全地添加到它。

相較之下,List< ;?超級T>允許您新增類型 T 或其子類別的值,因為您可以確定清單可以保存這些值而不違反其類型安全性。

範例:了解Collections.copy()

考慮Collections.copy() 的簽名:

public static <T> void copy(List<? super T> dest, List<? extends T> src)
登入後複製

注意src 的通配符(? extends T) 如何允許你傳遞保存類型T 或其子類別的值的任何列表,保證src 產生的值將是類型T 或其子類別。這使得該方法能夠處理各種清單類型,安全地複製值。

結論

了解使用泛型通配符的限制對於編寫健全的 Java 程式碼至關重要。請記住,您無法添加到列表因為你不能保證它所指向的清單的具體類型。相反,您只能從中讀取並確保取得 T` 類型或其子類別的值。

以上是為什麼我無法將元素添加到列表中的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板