bubble: Verschachtelte Generics

Beitrag lesen

Weil die Signaturen verschieden sind (iirc, nannte man dieses Typgedöhns Signaturen, oder waren das die Definitionen von Funktionen?)
Afaik meinen Signaturien die... Eigenschaften von Funktionen (Parameter).

List<List<String>> würde bedeuten, dass man jegliche Instanzen dessen Klassen vom Typ List erben und String "verwenden" akzeptieren würde (Du könntest zB. ArrayList<String>- und Vector<String>-Instanzen reinstopfen). Durch Vector<Vector<String>> geht das aber nicht mehr, da ArrayList<String> halt kein Vector<String> ist.

Aber ich kann doch später irgendwann myList = new ...; machen und dann eben später doch ArrayLists reinstopfen. Jedenfalls rein logisch, das sollte keine Laufzeitfehler geben können imho.

Das kommt halt drauf an. Eine List<List<String>> gibt halt bei den Funktionen immer ein List<String> zurück, beziehungsweise erwartet List<String>.
Da kann ich halt meine ArrayList<String>- und meine Vector<String>-Instanzen reinstopfen.

Eine Vector<Vector<String>> oder auch List<Vector<String>> verlangt halt immer Vector<String> als Parameter bzw, gibt Vector<String> zurück.
Da kann ich nur noch meine Vector<String>-Instanzen reinstopfen.

Trotzdem ist das was du willst möglich:
List<? extends List<String>> myList = new Vector<Vector<String>>();
Wie nennt man diese Syntax? Das "?" steht also für eine anonyme Klasse sozusagen?

Wie man die Syntax genau nennt weiß ich auch nicht. Das ? ist sozusagen 'ne Wildcard und durch das "extends Class" wird einfach nur spezifiziert, dass der wirkliche Typ davon oder einer Sub-Klasse sein muss. Ich fand verwirrend, dass man auch "extends" verwenden muss wenn man ein Interface spezifiziert.

Ich hoffe meine laienhaften Erklärungen konnten ein wenig Licht ins Dunkel bringen :')

MfG
bubble

--
If "god" had intended us to drink beer, he would have given us stomachs. - David Daye