Java:父类(super class)的接口(interface)泛型

标签 java generics interface

想象一下下面的代码:

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/

相关文章:

java - 如何将键值作为其他Map的键?

java - 如何在spring roo项目中调用.aj文件中的方法?

java - 具有并行性的 ForkJoinPool 构造函数

带有可选数组的 Swift 4 自定义通用结构表现得很奇怪?

java - 在 Java 中实现通用接口(interface)的枚举常量

python - 如何在python中集成一个简单的菜单

haskell - 隐藏数据类型的构造函数

java - 使用 java.lang.reflection 的构造函数的 AspectJ 切入点

java - 在 Scala 中实现多级 Java 接口(interface)

java - 我无法编译 hamcrest hasKey() 方法