面向对象中嵌套泛型的继承问题:为何无法调用对应方法?
为什么
container.m(obj)无法执行? 核心原因是Java泛型默认是不变的——哪怕B是A的子类,C<B>和C<A>之间也没有继承关系。
看你的代码细节:
container是C<C<A>>类型,它的m方法只能接收C<A>类型的参数obj是C<B>类型,由于泛型不变性,C<B>并不属于C<A>的子类范畴,自然无法作为参数传入。
解决方法:用通配符放宽类型限制
只要调整container的类型声明,通过通配符? extends A允许它接受所有C<继承自A的类型>的实例,就能让代码正常编译:
public class Test { class A {} class B extends A {} class C<T> { void m(T t) {} } void test() { C<C<? extends A>> container = new C<>(); C<B> obj = new C<>(); container.m(obj); // 现在可以正常执行 } }
如果需要兼容更宽泛的父类场景,也可以使用? super通配符:
C<? super C<B>> container = new C<>(); C<B> obj = new C<>(); container.m(obj);
嵌套列表场景的对应情况
换成实际开发中的嵌套列表场景,比如List<List<A>>无法添加List<B>元素,本质和这个问题完全一致——List<B>不是List<A>的子类。解决时只需把外层列表声明为List<List<? extends A>>,就能正常添加List<B>类型的元素。
内容的提问来源于stack exchange,提问作者derdilla
相关产品推荐
相关产品推荐

