อะไรคือความแตกต่างระหว่างList
, List<?>
, List<T>
, List<E>
และList<Object>
?
1. รายการ
List
: typesafe
เป็นชนิดดิบดังนั้นจึงไม่ มันจะสร้างข้อผิดพลาดรันไทม์เฉพาะเมื่อแคสต์ไม่ดี เราต้องการข้อผิดพลาดในการรวบรวมเวลาเมื่อนักแสดงไม่ดี ไม่แนะนำให้ใช้
2. รายการ <?>
List<?>
เป็นอักขระตัวแทนที่ไม่มีขีด จำกัด แต่ฉันไม่แน่ใจว่ามันมีไว้เพื่ออะไร? ฉันสามารถพิมพ์ได้List<?>
โดยไม่มีปัญหา:
public static void test(List<?> list){
System.out.println(list); // Works
}
ทำไมฉันไม่สามารถเพิ่มรายการลงใน a List<?>
?
public static void test(List<?> list){
list.add(new Long(2)); // Error
list.add("2"); // Error
System.out.println(list);
}
3. รายการ <T>
public static void test(List<T> list){ // T cannot be resolved
System.out.println(list);
}
ฉันไม่เข้าใจไวยากรณ์นี้ ฉันเห็นบางสิ่งเช่นนี้และใช้งานได้:
public <T> T[] toArray(T[] a){
return a;
}
บางครั้งผมเห็น<T>
หรือ<E>
หรือ,<U>
<T,E>
พวกเขาเหมือนกันทั้งหมดหรือพวกเขาเป็นตัวแทนของสิ่งที่แตกต่างกันอย่างไร
4. รายการ <Object>
สิ่งนี้ทำให้เกิดข้อผิดพลาด "วิธีtest(List<Object>)
นี้ใช้ไม่ได้กับการโต้แย้งList<String>
":
public static void test(List<Object> list){
System.out.println(list);
}
ถ้าฉันลองทำเช่นนี้ฉันจะได้ "ไม่สามารถส่งจากList<String>
ไปยังList<Object>
":
test((List<Object>) names);
ฉันสับสน. String
เป็น subclass ของObject
ดังนั้นทำไมไม่ได้เป็นList<String>
subclass ของList<Object>
?
2
สำหรับรายการเท่านั้นอ่านต่อ2
ผมเขียนรหัสบางอย่างที่จะแสดงให้เห็นถึงนี้ tyvm