You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

面向对象中嵌套泛型的继承问题:为何无法调用对应方法?

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:00:08