Ich denke, was Sie Folgendes tun möchten, ist: auf T
public abstract class Draw<T extends Draw> {
public abstract T duplicate();
}
public class Circle extends Draw<Circle> {
@Override
public Circle duplicate() {
return new Circle();
}
}
public class Square extends Draw<Square> {
@Override
public Square duplicate() {
return new Square();
}
}
- Verwendung der Generika (mit Einschränkung, sollte diese erweitern
Draw
, um seltsame Vererbung wie Circle extends Draw<List>
zu vermeiden)
- Fügen Sie
abstract
Stichwort zu die Draw
Klasse
Dann können Sie folgendes tun:
Square originalSquare = new Square();
Circle originalCircle = new Circle();
Square duplicatedSquare = originalSquare.duplicate();
Circle duplicatedCircle = originalCircle.duplicate();
EDIT
Ohne die Generika, Sie so etwas wie dies tun könnte:
public abstract class Draw {
public abstract Draw duplicate();
}
public class Circle extends Draw {
@Override
public Circle duplicate() {
return new Circle();
}
}
public class Square extends Draw {
@Override
public Square duplicate() {
return new Square();
}
}
Dank Pavel, Rgettman und Enno Shioji wusste ich nichts von "kovariant return type".
Draw sollte eine abstrakte Klasse sein. Sonst sieht es gut aus – k2col