ฉันดูเหมือนจะมีความเข้าใจผิดเกี่ยวกับความแตกต่างระหว่างและ<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
เป็นรอง