Vererbung Generizität und Vererbung

undercover

Aktives Mitglied
Hi Leute,

könnt ihr mir sagen wieso diese Zuweisung korrekt ist.
Folgende Klassen sind gegeben:
class B { ... }
class A extends B { ... }
class C<T> extends A { ... }
class D<T> { ... }
class E<T> extends D<T> { ... }
class F<T> extends C<String> { ... }

Zuweisung
C<String> a = new F<Integer>(); ja

Hat es was damit zutun das die Klasse C beim erweitern der Klasse F konkretisiert wurde? Weil die Klasse C an sich ja unkonkretisiert war.
Normal ist ja die regel beide unkonkretisiert dann muss die Zuweisung vom selben Typenparameter sein also z.B. C <String> a = new D<String>();

Gruß
 
Danke 🙂 wieder blitzschnell^^

Etwas was ein <?> als Typenparameter hat kann ich alles zuweisen? Sprich
C<?> a = new F<Integer>();
D<?> b = new E<Long>();

?
 
Genauer gesagt ist der Grund für die erste Frage, dass das T von F ein anderes ist wie das T von C, die heissen nur anders. Bei F<Integer> ist dann im Endeffekt C.T = D.T = E.T = F.T = Integer, aber C.T = String, weshalb du das auch C<String> zuweisen kannst.

Das ? bedeutet, dass dort jeder Typ stehen könnte. Deswegen kannst du auch alle zuweisen. Das hat aber auch die Konsequenz, dass du auf einer Referenz mit ? keine Methode aufrufen kannst, die eines der ? als Parameter hat.
 

Zurück
Oben