首頁 > Java > java教程 > 為什麼我無法使用通配符泛型類型(如 `)為 Java 集合新增值?擴展父級`?

為什麼我無法使用通配符泛型類型(如 `)為 Java 集合新增值?擴展父級`?

Patricia Arquette
發布: 2024-12-03 13:51:10
原創
698 人瀏覽過

Why Can't I Add Values to a Java Collection with a Wildcard Generic Type like `? extends Parent`?

向具有通配符泛型類型的Java 集合添加值的問題

考慮以下程式碼,其中Parent 是一個介面:

List<? extends Parent> list = ...;
Parent p = factory.get();   // returns concrete implementation
list.set(0, p);   // fails here: set(int, ? extends Parent) cannot be applied to (int, Parent)
登入後複製

為什麼這段程式碼會失敗?

問題關鍵在於通配符泛型類型的使用?擴充父級。此語法表示該清單可以包含擴充 Parent 的任何類型的物件。雖然這提供了靈活性,但它也增加了清單中物件的實際類型的一定程度的不確定性。

要理解程式碼失敗的原因,請考慮以下場景:

List<Child> childList = new ArrayList<Child>();
childList.add(new Child());

List<? extends Parent> parentList = childList;
parentList.set(0, new Parent());

Child child = childList.get(0); // No! It's not a child! Type safety is broken...
登入後複製

通配符類型?擴充Parent允許我們將childList指派給parentList。但是,當我們嘗試在parentList中設定Parent類型的物件時,編譯器無法保證childList中對應的物件也是Child類型。這可能會導致運行時錯誤或意外行為。

為了維護型別安全,編譯器限制可以對具有通配符泛型類型的集合執行的操作。在這種情況下,禁止將物件指派給列表,因為編譯器無法保證該物件與列表的未知類型的相容性。

以上是為什麼我無法使用通配符泛型類型(如 `)為 Java 集合新增值?擴展父級`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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