mir ist klar, dass eine List<? extends Number> zB eine List<Integer> akzeptieren kann, weil durch die Wildcard gekennzeichnet ist, dass man nur lesend auf die liste zugreifen kann und es somit kein Problem gibt (also keine falschen typen in die liste kommen können). selbiges erreiche ich aber auch mit List<T extends Number>. hat der ? operator nur den vorteil, dass man nicht im methoden-kopf einen weiteren generischen Typen hinzufügen muss?
wenn ich mich recht erinnere, sind bei beispiel eins nur Objekte als Parameter zulässig, die exakt vom Typ T sind. Beim zweiten Beispiel sind Objekte der Klasse A möglich, sowie auch deren Unterklassen, was im ersten Beispiel nicht der Fall ist.
Bin mir nicht mehr 100% sicher. wenns falsch ist, lasse ich mich gerne eines besseren belehren.
mir ist klar, dass eine List<? extends Number> zB eine List<Integer> akzeptieren kann, weil durch die Wildcard gekennzeichnet ist, dass man nur lesend auf die liste zugreifen kann und es somit kein Problem gibt (also keine falschen typen in die liste kommen können). selbiges erreiche ich aber auch mit List<T extends Number>. hat der ? operator nur den vorteil, dass man nicht im methoden-kopf einen weiteren generischen Typen hinzufügen muss?
Das ? steht an dieser Stelle grundsätzlich für einen unbekannten bzw. beliebigen Typen. Sprich eine List<?> könnte theoretisch alle möglichen Objekte aufnehmen. Dein Beispiel List<? extends A> schränkt das ganze jetzt so ein, dass die List alle möglichen Objekte aufnehmen können, die von A erben (evtl. reicht auch wenn das betreffende Objekt A implementiert, bin mir da aber nicht sicher).
@gast: ja, es reicht immer auch, wenn ein Interface implementiert ist.
@beide:
ich hab das auch immer so verstanden, wie ihr. und ja, den ? operator kann man so verwenden wie von euch beschrieben. Allerdings: wenn ich wie im anderen Beispiel anstatt des ? einen eigenen generischen Parameter <T extends A> definiere (im Methodenkopf), dann akzeptiert der Compiler genauso alle möglichen Listen, die auch List<? extends A> akzeptiert.
warum hab ich das mit google nicht gefunden? das ist genau, was ich gesucht hatte, danke!
auf seite 8/9 wird exakt auf meine frage eingangen:
... this is a sign that we can replace S with a wildcard. Using wildcards is clearer and much more concise than decalring explicit type parameters, and should therefore be preferred whenever possible
ich hatte also anscheinend recht, dass man prinzipiell beide varianten nehmen kann. aber wenn der ? operator ausreicht, muss man eben keinen zusätzlichen generischen Parameter im Methoden Kopf deklarieren und leserlicher ist es aus. --> solange es ausreicht ? verwenden.