Javagenerics – 覆盖抽象方法并具有子类的返回类型
我正在尝试创建一个设置,其中一组子类覆盖超类。 这个超类包含一个抽象方法 – 理想情况下,它的返回类型是调用此方法的对象的返回类型,因此它的行为有效地如下:
public abstract class SuperClass{ public abstract SuperClass getSelf(); } public class SubClass extends SuperClass{ @Override public SubClass getSelf(){ return this; } }
我不确定这样的事情是否可能,因为我认为返回类型总是必须相同才能使覆盖工作 – 但是我一直在想答案,如果存在的话,就在这条线的某个地方…
public abstract class SuperClass{ public abstract getSelf(); } public class SubClass extends SuperClass{ @Override public SubClass getSelf(){ return this; } }
谢谢你的帮助。
编辑:添加扩展SuperClass到SubClass,呃
这将有效:
public abstract class SuperClass{ public abstract SuperClass getSelf(); } public class SubClass extends SuperClass{ @Override public SubClass getSelf(){ return this; } }
注意我已经将extends SuperClass
添加到您的SubClass
定义中。 getSelf
的返回类型称为协变返回类型 。
这个怎么样:
public abstract class SuperClass> { public abstract T getSelf(); } public class SubClass extends SuperClass { public SubClass getSelf() { return this; } }
我知道它是相当重复的,没有任何东西将类型绑定为相同的SubClass
实例,因为AnotherSubClass
也会满足绑定,但至少它应该可以解决问题。
以下是如何做到这一点(从JDK 1.5开始,有一种称为协变返回类型的东西,这样的东西是可能的)。
abstract class SuperClass>{ public abstract T getSelf(); } class SubClass extends SuperClass { public SubClass getSelf() { return this; } } public class Generics { public static void main(String[] args) { System.out.println(new SubClass().getSelf()); } }
注意与Enum类似的类通用定义(http://download.oracle.com/javase/1,5.0/docs/api/java/lang/Enum.html)
看看幕后发生了什么(通过使用javap SuperClass SubClass ):
class SubClass extends SuperClass{ SubClass(); public SubClass getSelf(); public SuperClass getSelf(); } abstract class SuperClass extends java.lang.Object{ SuperClass(); public abstract SuperClass getSelf(); }
注意子类方法如何具有不同的返回类型,这是超类方法返回类型的子类型。
顺便说一句,注意public SuperClass getSelf();
在类SubClass
中实际上是一种合成方法。