ฉันเคยเห็นตัวแทนที่ใช้มาก่อนเพื่อหมายถึงวัตถุใด ๆ - แต่เพิ่งเห็นการใช้:
<? 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คลาส