ฉันดูเหมือนจะมีความเข้าใจผิดเกี่ยวกับความแตกต่างระหว่างและ<Foo> <? extends Foo>จากความเข้าใจของฉันถ้าเรามี
ArrayList<Foo> foos = new ArrayList<>();
สิ่งนี้บ่งชี้ว่าวัตถุประเภทFooสามารถเพิ่มในรายการอาร์เรย์นี้ เนื่องจากคลาสย่อยของFooยังเป็นประเภทFooจึงสามารถเพิ่มได้โดยไม่มีข้อผิดพลาดตามที่แสดงใน
ArrayList<Foo> foos = new ArrayList<>();
foos.add(new Foo());
foos.add(new Bar());
Bar extends Fooที่ไหน
ตอนนี้พูดว่าฉันได้กำหนดไว้foosเป็น
ArrayList<? extends Foo> foos = new ArrayList<>();
some unknown type that extends Fooเข้าใจในปัจจุบันของฉันคือเป็นการแสดงออกที่ว่านี้ ฉันใช้สิ่งนี้เพื่อหมายความว่าวัตถุใด ๆ ที่เป็น subclass ของFooสามารถเพิ่มลงในรายการนี้; หมายความว่ามีความแตกต่างระหว่างไม่มีและArrayList<Foo>ArrayList<? extends Foo>
เพื่อทดสอบสิ่งนี้ฉันพยายามเขียนรหัสต่อไปนี้
ArrayList<? extends Foo> subFoos = new ArrayList<>();
subFoos.add(new Foo());
subFoos.add(new Bar());
แต่ได้รับแจ้งพร้อมกับข้อผิดพลาดในการรวบรวม
no suitable method found for add(Foo)
method java.util.Collection.add(capture#1 of ? extends Foo) is not applicable
(argument mismatch; Foo cannot be converted to capture#1 of ? extends Foo)
no suitable method found for add(Bar)
method java.util.Collection.add(capture#2 of ? extends Bar) is not applicable
(argument mismatch; Bar cannot be converted to capture#2 of ? extends Bar)
จากความเข้าใจปัจจุบันของฉันฉันเห็นได้ว่าเหตุใดฉันจึงไม่สามารถเพิ่มFooรายการลงในรายการ<? extends Foo>เพราะมันไม่ได้เป็นคลาสย่อยของตัวเอง แต่ฉันอยากรู้ว่าทำไมฉันไม่สามารถเพิ่มลงBarในรายการ
รูในความเข้าใจของฉันอยู่ที่ไหน
<? extends Foo>เป็นที่เฉพาะเจาะจงและไม่รู้จักFooคลาสที่ขยาย การดำเนินการกับการเรียนนี้เป็นกฎหมายเฉพาะในกรณีที่มันจะเป็นกฎหมายสำหรับการใด ๆ ที่Fooเป็นรอง