อะไรคือความแตกต่างระหว่าง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