Ein Auszug aus dem Buch Java-ist-auch-eine-Insel
http://www.galileocomputing.de/openbook/javainsel4/javainsel_06_012.htm#Xxx999378
=============================================================================
......
6.13.3 Generics und Vererbung
In Zusammenhang mit Generis und Vererbung muss beachtet werden, dass die übliche Substitution nicht funktioniert. Wenn Disko eine Unterklasse von Gebäude ist, so ist Box<Disko> nicht Unterklasse von Box<Gebäude>! Der Compiler meckert aber den Versuch schon an, so dass wir vor der Versuchung gehindert werden.
Box<Gebäude> box;
box = new Box<Disko>(); // incompatible types
Die Erklärung ist schnell an einem Beispiel gezeigt. Nehmen wir noch eine Kirche dazu und halten in Erinnerung, dass Kirche und Disko beides Unterklassen von Gebäude sind. Da nun die Box in setValue() alles vom Typ Gebäude aufnimmt – und Kirchen und Diskotheken sind Gebäude – würde erst einmal funktionieren:
box.setValue( new Kirche() );
Doch da die Box tatsächlich mit Diskotheken aufgebaut wurde, passt die Kirche hier nicht rein. Verändern wir die Initialisierung der Box in box = new Box<Disko>(); funktioniert das natürlich wieder.
=============================================================================
Das zweite Beispiel vertehe ich nicht ganz?
Dies hier sollte funktionieren:
aber was funktioniert sonst noch ?
Gruß Mindbreaker
http://www.galileocomputing.de/openbook/javainsel4/javainsel_06_012.htm#Xxx999378
=============================================================================
Code:
.....
class Box<T>
{
private T val;
void setValue( T val )
{
this.val = val;
}
T getValue()
{
return val;
}
}
6.13.3 Generics und Vererbung
In Zusammenhang mit Generis und Vererbung muss beachtet werden, dass die übliche Substitution nicht funktioniert. Wenn Disko eine Unterklasse von Gebäude ist, so ist Box<Disko> nicht Unterklasse von Box<Gebäude>! Der Compiler meckert aber den Versuch schon an, so dass wir vor der Versuchung gehindert werden.
Box<Gebäude> box;
box = new Box<Disko>(); // incompatible types
Die Erklärung ist schnell an einem Beispiel gezeigt. Nehmen wir noch eine Kirche dazu und halten in Erinnerung, dass Kirche und Disko beides Unterklassen von Gebäude sind. Da nun die Box in setValue() alles vom Typ Gebäude aufnimmt – und Kirchen und Diskotheken sind Gebäude – würde erst einmal funktionieren:
box.setValue( new Kirche() );
Doch da die Box tatsächlich mit Diskotheken aufgebaut wurde, passt die Kirche hier nicht rein. Verändern wir die Initialisierung der Box in box = new Box<Disko>(); funktioniert das natürlich wieder.
=============================================================================
Das zweite Beispiel vertehe ich nicht ganz?
Dies hier sollte funktionieren:
Code:
Box<Disko> box = new Box<Disko>();
box.setValue(new Disko());
aber was funktioniert sonst noch ?
Gruß Mindbreaker