向具有通配符泛型類型的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中文網其他相關文章!