理想场景
让我们设想一个场景,有两个类,如A
和B
,其中B扩展A。我还有第三个泛型类C<T>
,它有一个方法m(T t)
。
如果我创建一个对象C<C<A>> container
和另一个对象C<B> obj = new C<>();
,为什么我不能运行container.m(obj)
?
完整代码示例
public class Test {
class A {}
class B extends A {}
class C<T> {
void m(T t) {}
}
void test() {
C<C<A>> container = new C<>();
C<B> obj = new C<>();
container.m(obj);
}
}
实际案例
这个问题在嵌套列表中变得很明显,在我的简化示例中,C<A>
将是一个List<A>
。
Oracle强调了一些limitations of generics,但我找不到任何描述这个问题以及如何处理它的内容。
1条答案
按热度按时间ifsvaxew1#
问题
正如VGR所指出的:
C<B>
不扩展C<A>
。所以除了
B
本身之外,C<B>
不具有C<A>
的任何属性。当查看
C<A>
和C<B>
生成的内容时,这一点变得更加清晰:C<A>
就像一个而
C<B>
的作用类似于当以这种松散的方式查看它时,很明显,类
E
没有扩展类D
。解决方案
正如Elliott Frisch所说,可以通过将
C<A>
更改为C<? extends A>
来避免这种情况。完整工作示例: