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>
- undVector<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