java 嵌套泛型的继承[面向对象]

xdyibdwo  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(126)

理想场景

让我们设想一个场景,有两个类,如AB,其中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,但我找不到任何描述这个问题以及如何处理它的内容。

ifsvaxew

ifsvaxew1#

问题
正如VGR所指出的:C<B>不扩展C<A>
所以除了B本身之外,C<B>不具有C<A>的任何属性。
当查看C<A>C<B>生成的内容时,这一点变得更加清晰:C<A>就像一个

class D {
    void m(A t) {}
}

C<B>的作用类似于

class E {
    void m(B t) {}
}

当以这种松散的方式查看它时,很明显,类E没有扩展类D

解决方案

正如Elliott Frisch所说,可以通过将C<A>更改为C<? extends 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);
    }
}

相关问题