Was sind die Unterschiede zwischen List
, List<?>
, List<T>
, List<E>
, und List<Object>
?
1. Liste
List
: ist ein Rohtyp, daher nicht typesafe
. Es wird nur dann ein Laufzeitfehler generiert, wenn das Casting schlecht ist. Wir möchten einen Fehler bei der Kompilierung, wenn die Besetzung schlecht ist. Nicht zu empfehlen.
2. Liste <?>
List<?>
ist eine unbegrenzte Wildcard. Aber ich bin nicht sicher, wofür es ist? Ich kann List<?>
ohne Probleme drucken :
public static void test(List<?> list){
System.out.println(list); // Works
}
Warum kann ich keine Elemente zu einem hinzufügen List<?>
?
public static void test(List<?> list){
list.add(new Long(2)); // Error
list.add("2"); // Error
System.out.println(list);
}
3. Listen Sie <T> auf
public static void test(List<T> list){ // T cannot be resolved
System.out.println(list);
}
Ich verstehe diese Syntax nicht. Ich habe so etwas gesehen und es funktioniert:
public <T> T[] toArray(T[] a){
return a;
}
Manchmal sehe ich <T>
, oder <E>
, oder <U>
, <T,E>
. Sind sie alle gleich oder repräsentieren sie etwas anderes?
4. Listen Sie <Objekt> auf
Dies gibt den Fehler "Die Methode test(List<Object>)
ist für das Argument nicht anwendbar List<String>
":
public static void test(List<Object> list){
System.out.println(list);
}
Wenn ich das versuche, bekomme ich "Kann nicht von List<String>
bis gewirkt werden List<Object>
":
test((List<Object>) names);
Ich bin verwirrt. String
ist eine Unterklasse von Object
, warum ist also keine List<String>
Unterklasse von List<Object>
?
2
. Ich schreibe einige Codes, um dies zu demonstrieren2
. tyvm