Java方法从继承返回类型

时间:2016-11-13 02:09:06

标签: java oop generics inheritance

我正在类Parent中编写一个方法,该方法返回一组对象A。但是,我有一个班级Child(继承表格Parent)。我希望它返回一组对象BB继承自A)。

更具体地说,我的方法看起来像这样(它现在抛出编译错误)。

Parent类方法:

public abstract <T extends A> Set<T> getSet();

Child类(扩展Parent类)方法:

public <T extends B> Set<T> getSet() {...}

是否可以这样做,或者没有意义?

1 个答案:

答案 0 :(得分:3)

首先,让我解释为什么你的代码不能编译。基本上,如果您有class A {}class B extends A {},那么Set<B> Set<A>的子类型。因此,如果您的父方法返回Set<A>,则您的覆盖必须返回相同的内容。 Set<B>完全不同的类型

同样,Set<T extends B>不是Set<T extends A>的子类型。完整的解释见Java docs

我能想到的最接近的解决方案是使用通配符:

class A {}

class B extends A {}

abstract class Parent {
    abstract Set<? extends A> getSet();
}

class Child extends Parent {
    Set<? extends B> getSet() {
        return new HashSet<B>();
    }
}

Set<? extends B> Set<? extends A>的子类型,现在由于covariant return types而有效(感谢Lii&amp; Marco13的评论)。

根据您想要达到的目标,这可能比您预期的更有限,但可能会尽可能接近。

也许类似的东西可以使用内部类来实现,正如Jude所说,但我不知道这将是一个更方便的解决方案。