Implementierung einer abstrakten generischen Methode in Java mit mehreren generischen TypenJava

Java-Forum
Anonymous
 Implementierung einer abstrakten generischen Methode in Java mit mehreren generischen Typen

Post by Anonymous »

Es geht um generische Methoden in Java mit zwei generischen Typen (einer für den Rückgabetyp und einer für einen formalen Parameter) und wie man sie implementiert.
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);
}
Das funktioniert nicht:

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);
}
Der Java-Compiler schreit mir Folgendes zu:

Code: Select all

 is not abstract and does not override abstract method get(K) in Getter
Nun, das ist die Situation.
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;
}

}
AKTUALISIERT:
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
}

}
inzwischen in einem anderen Teil des Codes...

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();
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post