Java泛型 - 覆盖抽象方法以及具有该子类的返回类型

我想打造一个集起来,其中一组子类覆盖一个超。 这个超包含一个抽象方法 - 它的返回类型将理想是,从该方法被调用的对象,这样它有效的行为像这样的:

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 <? extends SuperClass> getSelf(); } public class SubClass extends SuperClass{ @Override public SubClass getSelf(){ return this; } }

感谢您的帮助。

编辑:增加了扩展超类,子类,咄

--------------解决方案-------------

这将工作:

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<T extends SuperClass<?>> {
public abstract T getSelf();
}

public class SubClass extends SuperClass<SubClass> {
public SubClass getSelf() {
return this;
}
}

我知道这是相当重复的,没有界限的类型是一样的SubClass的实例,也因为AnotherSubClass将满足约束,但至少它应该做的伎俩。

这里是如何做到这一点(因为JDK 1.5有这个东西叫做协变返回类型,在这样的事情是可能的)。

abstract class SuperClass<T extends SuperClass<T>>{
public abstract T getSelf();
}

class SubClass extends SuperClass<SubClass> {
public SubClass getSelf() { return this; }
}

public class Generics {
public static void main(String[] args) {
System.out.println(new SubClass().getSelf());
}
}

注意与枚举类似的类一般定义(http://download.oracle.com/javase/1,5.0/docs/api/java/lang/Enum.html)

看到幕后发生的事情(通过使用javap的父类子类):

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其实是一个人工合成的方法。

分类:java的 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.580 (s). 10 q(s)