我正在类Parent
中编写一个方法,该方法返回一组对象A
。但是,我有一个班级Child
(继承表格Parent
)。我希望它返回一组对象B
(B
继承自A
)。
更具体地说,我的方法看起来像这样(它现在抛出编译错误)。
Parent
类方法:
public abstract <T extends A> Set<T> getSet();
Child
类(扩展Parent
类)方法:
public <T extends B> Set<T> getSet() {...}
是否可以这样做,或者没有意义?
答案 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所说,但我不知道这将是一个更方便的解决方案。