<T> vs. <?>

mrbela

Bekanntes Mitglied
Hey Leute!

Wenn ich eine generische Methode oder Klasse selbst implementiere, gebe ich ja immer <T> mit (oder ein <T extends ...>, etc.).

Nun gibt es aber ja auch die Wildcards.

Stimmt es, dass diese nur zum Tragen kommen, wenn ich eine Zuweisung von bspw. Containern mache?

so z.B.:

Java:
List<Integer> intList = new Vector<Integer>();
List<?> list = intList;

Eigentlich sind doch <T> und <?> gleichbedeutend oder? Nur der Ort des Einsatzes unterscheided sie?!

Danke für die Hilfe!
 
S

Spacerat

Gast
Nein, die sind definitiv nicht Gleichbedeutend. Das T ist eine generische Variable, die stets definiert werden muss, also verbirgt sich dahinter immer eine definierte Klasse. Wildcards lassen sich z.B. deswegen auch nicht instanzieren. Während
Java:
static <T extends List<T>> T getList() {
  List<?> rc = new ArrayList<T>();
  return (T) rc;
}
funktioniert, scheitert
Java:
static <T extends List<T>> T getList() {
  List<?> rc = new ArrayList<?>();
  return (T) rc;
}
 

HimBromBeere

Top Contributor
Das Fragezeichen ist das Datentyp-Äquivalent einer Variablen, kann also variabel sein. T (oder Katzenfutter wie ich mal in einem C++-Buch gelesen hab :D) dagegen ist ein fester Datentyp. Alles, was links von ´nem Zuweisungsoperator steht, kann ja variabel sein, alles rechtsa davon muss sich irgendwie in einen (konstanten) Wert umrechnen lassen, wozu auch ein genau definerter Datentyp gehört.
Darum geht das:
Java:
List<?> rc = new ArrayList<T>();
Und das nicht
Java:
List<?> rc = new ArrayList<?>();
 
B

bygones

Gast
wobei man sagen muss dass
Java:
List<?> rc = new ArrayList<T>();
ziemlich nutzlos ist - man bekommt nur Objects raus und hinzufuegen kann man nix....
 

Oben