Generics wildcard

Javt

Aktives Mitglied
Hi,

Folgendes:
Java:
public static void printAllNumbers2(List<?> numbers)..
ist doch dasselbe wie:
Java:
public static void printAllNumbers2(List numbers)

Wieso soll man also das schreiben. Macht doch keinen Sinn:
Java:
public static void printAllNumbers2(List<?> numbers)..

lg
 
Zuletzt bearbeitet:
EDIT: vorhin hattest du noch nach List<?> und List<Object> gefragt, darauf bezieht sich hier auch meine Antwort.


Nein, es gibt nen Unterschied zwischen einer List<?> und einer List<Object>:

Java:
List<?> list = new ArrayList<>();
list.add("Hallo"); // geht nicht

List<Object> list2 = new ArrayList<>();
list2.add("Hallo"); // geht

// auslesen kannst du aber aus beiden
Object obj1 = list.get(0);
Object obj2 = list2.get(0);

List in der Rawtype dazu, das sollte man sowieso nichtmehr verwenden wenn man Java > 1.5 zur Verfügung hat.
 
list.add("Hallo"); // geht nicht

Und wieso geht das nicht? Die "list" hat ja weiterhin die Methode "add". Wieso kann ich keinen String hinzufügen? Wieso muss ich unbedingt folgendes machen:
Java:
((List<String>)list).add("test");

Wieso geht nicht einfach:
Java:
list.add("Hallo");

Das "?" steht doch für einen beliebigen Typ. Also sollte das doch kein Problem sein?
 
Zuletzt bearbeitet:
Weil die Liste von einem beliebigen (aber festen!) Typen ist. Es könnte sein dass du gar keine Strings hinzufügen darfst.

EDIT:
Hier nen Beispiel:
Java:
List<?> list = new ArrayList<Integer>();
list.add("Hallo");
Wär doch blöd wenn du in ne Integer Liste nen String hinzufügst.
 
Du sagst es und wieso gilt das dann nicht für folgenden Fall:
Java:
List<Object> list2 = new ArrayList<>();
list2.add("Hallo"); // geht

Hier dürfte ja strenggenommen auch nur reines "Object" erlaubt sein und nicht was anderes wie "String". Man kann ja auch nicht folgendes machen:
Java:
public static void printAll(List<Object> lst) ...
...
ArrayList<String> lst2 = new ArrayList<String>();
printAll(lst2);
 
Du vermischst da nen paar Sachen.

1)
Javt hat gesagt.:
Du sagst es und wieso gilt das dann nicht für folgenden Fall:
Java:
List<Object> list2 = new ArrayList<>();
list2.add("Hallo"); // geht
Hier dürfte ja strenggenommen auch nur reines "Object" erlaubt sein und nicht was anderes wie "String".
list2 ist eine List<Object>, das heißt es dürfen Objekte drin liegen die entweder ein Object sind oder von Object erben. Ein String ist ein Object (String erbt, wie alle Klassen, von Object), also ist es kein Problem.

2)
Javt hat gesagt.:
Man kann ja auch nicht folgendes machen:
Java:
public static void printAll(List<Object> lst) ...
...
ArrayList<String> lst2 = new ArrayList<String>();
printAll(lst2);
Genau, das geht nicht. String ist zwar eine Unterklasse von Object, eine List<String> ist aber keine(!) Unterklasse von List<Object>, das ist der Unterschied.
 

Zurück
Oben