想象一下下面的代码:
class A {}
class B extends A {}
interface IA extends Iterable<A> {}
interface IB extends Iterable<B> {}
理想情况下,我希望接口(interface) IB
也能够扩展 IA
,因为它实际上允许您检索 A
.
interface IB extends Iterable<B>, IA {}
甚至
interface IB extends Iterable<B> implements IA {}
但是,编译器真的不喜欢这两者,如果允许这样做,我的代码会更好,因为从概念上讲,B 可以用作 A 而无需在任何地方进行向上转换
我可以使用哪些解决方案来解决这个问题?
最佳答案
non-covariance of generics意味着您想要的东西不可行(至少在一般情况下不可行)。
但是,也许wildcards会解决你的具体问题?例如
void methodThatOperatesOnA(Iterable<? extends A> it) {
...
}
这将允许您从 it
中提取元素,就像它们是 A
一样,但是编译器会阻止您插入对象,* 因为它不能保证不变量会得到维护。
* 除了
null
关于Java:父类(super class)的接口(interface)泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14407155/