Typ-Obergrenze und Typ-Untergrenze

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Typ-Obergrenze und Typ-Untergrenze
Hi zusammen,

ich bin beim Vorbereiten auf die AuD-Klausur auf ein Verständnisproblem gestoßen.
Es handelt sich um Foliensatz 10, Folie 26.
Die Geschichte mit der Typ-Obergrenze verstehe ich ja, aber ich den Code in dem Kästchen
darunter verstehe ich nicht.

Warum ist “insertAudi(new MyArray);” zu speziell? Ist das jetzt zu speziell für insertAudi oder für MyArray?

Verstehe ich das richtig, dass <? super Audi> alle Klassen betrifft, die von Audi erben? Also in dem Fall nur A6, aber theoretisch auch A4, A3 usw? Oder heißt das nur Klassen, die direkt von Audi erben?
Also würde dann zum Beispiel die Klasse “class A6Diesel extends A6” funktionieren?

Und was dann in der Sprechblase steht, verwirrt mich auch “Da insertAudi als Typ-Untergrenze mit Audi aufgerufen werden könnte, kann nicht sicher in jedem Fall ein Car hinzugefügt werden”.
Warum “könnte” und “nicht sicher in jedem Fall”? Ich dachte, das <? super Audi> stellt eben sicher, dass genau nur das passieren darf.

Ich hoffe ihr versteht mein Problem, ich find’s ziemlich knifflig, das gut verständlich zu beschreiben.
VG
C


Das funktioniert alles (also A4, A3, A6Diesel, das von A6 erbt, …) und selbst „array.add(new Audi());“ funktioniert.


Ok und wo liegt dann der Unterschied zu <? extends Audi> ?
Und warum ist dann insertAudi(new MyArray) zu speziell?
Ein Array vom Typ A6 erfüllt doch genau die Bedinung, die <? super Audi> vorgibt, oder nicht?


Das [m]? super Audi[/m] sagt folgendes aus: du darfst dich in der Methode darauf verlassen, dass du sicher Objekte vom Typ [m]Audi[/m] und spezifischeren Klassen hinzufuegen kannst.
Damit das funktioniert, laesst der Compiler nur Aufrufe zu, deren generischer Typ Audi oder generischer ist. Waer es spezieller, dann koennte man sich nicht sicher sein, was man in der Methode machen darf. Damit ist [m]super[/m] eben eine Typ-Untergrenze (im Gegensatz zu [m]extends[/m], was Typobergrenze ist).


Sorry, hab den Thread komplett vergessen :smiley:
Vielen Dank für die Hilfe, ich denke, ich hab’s jetzt verstanden