Ich vermute, dass mir auf dem Bild etwas fehlt, damit es funktioniert.
Die Sache ist folgende...
Das funktioniert :
Code: Select all
public enum Getter
{
BillItemsSize {
@Override
public Integer get (Object entity) {
DesiredClass ref = (DesiredClass ) entity; // "Old time" cast
// do things...
}
};
public abstract T get (K entity);
}
Code: Select all
public enum Getter
{
BillItemsSize {
@Override
public Integer get (DesiredClass entity) { // no cast at all
// do things
}
};
public abstract T get (K entity);
}
Code: Select all
is not abstract and does not override abstract method get(K) in Getter
P.D: Es ist kein Problem von Aufzählungstypen. Es passiert über Klassenhierarchien hinweg. Machen Sie sich also nicht die Mühe, den Aufzählungen die Schuld zu geben, ich habe es versucht und es funktioniert nicht.
Code: Select all
public abstract class SuperClass
{
public abstract T pepe (E e);
}
public class SubClass extends SuperClass
{
@Override
public Integer pepe(DesiredClass e) // fails...
{
return null;
}
}
Für Generics-Parameter
Wir können eine allgemeine Regelanweisung erstellen, dass für „Generics-Parameter“ (diejenigen, deren Typen generisch sind) der Typ, der implizit in der Methodensignatur verwendet wird, den Obergrenzen dieses Generikums entspricht. Dies kann Object sein, wenn nichts angegeben ist, oder eine spezifischere Unterklasse, wenn Obergrenzen verwendet werden (im Beispiel erweitert T String).
Für generische Rückgabetypen
Es gibt kein Problem, eine generische Methode mit einem bestimmten Rückgabetyp zu überschreiben, solange der Rückgabetyp ein Untertyp des überschriebenen Rückgabetyps ist. Und was ist überhaupt der Rückgabetyp? Nun, es ist zufällig Object. Standardmäßig nimmt der Compiler (in der Methodensignatur) den generischen Typ als Objekttyp an.
Wir müssen also davon ausgehen, dass der Trick darin besteht, zu wissen, dass jede Methode, die einen generischen Rückgabetyp hat, tatsächlich einen Object-Rückgabetyp hat.
Wenn dann in einer Unterklasse die Methode überschrieben wird und wir den Rückgabetyp so ändern, dass er einen anderen Typ zurückgibt, gibt es kein Problem. Denn abgesehen davon, dass diese Methode ein Objekt einer anderen Klasse zurückgibt, wird dieses zurückgegebene Objekt zwangsläufig eine Unterklasse der Object-Klasse sein und es wird kein Problem sein, eine Methode mit einem anderen Rückgabetyp als dem Original zu überschreiben, solange es ein Untertyp des Originals ist. Die Technik namens kovarianter Rückgabetyp ermöglicht es uns, so etwas zu tun.
Code: Select all
public abstract class SuperClass
{
public abstract T operation ();
}
public class SubClass extends SuperClass
{
@Override
public Chair operation()
{
//bla bla
}
}
Code: Select all
void main ()
{
SubClass sb = new SubClass();
Chair chair = sb.operation ();
// the chair type can be easely replaced by super type (like Object)
Object object = sb.operation();
}
Mobile version