ฉันเคยเห็นตัวแทนที่ใช้มาก่อนเพื่อหมายถึงวัตถุใด ๆ - แต่เพิ่งเห็นการใช้:
<? extends Object>
เนื่องจากออบเจ็กต์ทั้งหมดขยาย Object จึงมีการใช้งานทั้งสองนี้เหมือนกัน
ฉันเคยเห็นตัวแทนที่ใช้มาก่อนเพื่อหมายถึงวัตถุใด ๆ - แต่เพิ่งเห็นการใช้:
<? extends Object>
เนื่องจากออบเจ็กต์ทั้งหมดขยาย Object จึงมีการใช้งานทั้งสองนี้เหมือนกัน
คำตอบ:
<?>
และ<? extends Object>
มีความหมายเหมือนกันตามที่คุณคาดหวัง
มีบางกรณีที่มียาสามัญที่extends Object
ไม่ซ้ำซ้อนจริง ยกตัวอย่างเช่น<T extends Object & Foo>
จะทำให้เกิดการT
ที่จะกลายเป็นObject
ภายใต้การลบในขณะที่มี<T extends Foo>
มันจะกลายเป็นFoo
ภายใต้การลบออก (สิ่งนี้อาจมีความสำคัญหากคุณพยายามรักษาความเข้ากันได้กับ API รุ่นก่อนชื่อที่ใช้Object
)
ที่มา: http://download.oracle.com/javase/tutorial/extra/generics/convert.html ; มันอธิบายว่าทำไมjava.util.Collections
คลาสของ JDK จึงมีวิธีการที่มีลายเซ็นนี้:
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll
)
extends Object
จริงเป็นความหมาย ถ้าผิดพลาดยังไงก็ขออภัยด้วย หวังว่าจะเป็นที่สนใจของคนอื่น ๆ ที่เจอคำถามของคุณอย่างน้อยที่สุด
แม้ว่า<?>
ควรจะเป็นทางลัด<? extend object>
แต่ก็มีความแตกต่างเล็กน้อยระหว่างสองอย่างนี้
<?>
สามารถ reifiable ในขณะที่<? extend object>
ไม่ได้ เหตุผลที่พวกเขาทำเช่นนี้คือทำให้ง่ายต่อการแยกแยะประเภทที่นำกลับมาใช้ใหม่ได้ สิ่งใดที่มีลักษณะเช่น<? extends something>
, <T>
, <Integer>
มี nonreifiable
ตัวอย่างเช่นรหัสนี้จะใช้งานได้
List aList = new ArrayList<>();
boolean instanceTest = aList instanceof List<?>;
แต่สิ่งนี้ทำให้เกิดข้อผิดพลาด
List aList = new ArrayList<>();
boolean instancetest = aList instanceof List<? extends Object>;
สำหรับข้อมูลเพิ่มเติมโปรดอ่านข้อมูลทั่วไปและคอลเล็กชัน Java โดย Maurice Naftalin
<?>
<? extends Object>
เป็นชวเลข คุณสามารถอ่านลิงค์ที่แชร์ด้านล่างสำหรับรายละเอียดเพิ่มเติม
<?>
"?"
หมายถึงประเภทที่ไม่รู้จักซึ่งสามารถแสดงประเภทใดก็ได้ในรหัสสำหรับ ใช้สัญลักษณ์แทนนี้หากคุณไม่แน่ใจเกี่ยวกับประเภท
ArrayList<?> unknownList = new ArrayList<Number>(); //can accept of type Number
unknownList = new ArrayList<Float>(); //Float is of type Number
หมายเหตุ: <?>
หมายถึงสิ่งใด ๆ ดังนั้นจึงสามารถยอมรับประเภทที่ไม่ได้รับมาจากObject
คลาส
<? extends Object>
<? extends Object>
หมายความว่าคุณสามารถส่งผ่าน Object หรือคลาสย่อยที่ขยายObject
คลาสได้
ArrayList<? extends Number> numberList = new ArrayList<Number>(); //Number of subclass
numberList = new ArrayList<Integer>(); //Integer extends Number
numberList = new ArrayList<Float>(); // Float extends Number
T - ใช้เพื่อแสดงประเภท
E - ใช้เพื่อแสดงองค์ประกอบ
K - คีย์
V - ค่า
N - สำหรับตัวเลข
อ้างอิง:
Object
คลาส