请教一个java泛型的问题

有如下代码:
方法test参数是需要C类,但是因为B类继承C,所以我传B是OK的。

public class A {

    public static void main(String[] args){
        B b = new B();
        test(b);
    }

    private static void test(C c){

    }

}

class B extends C{

}

class C{

}

但是如下代码却不行,不理解?

import java.util.ArrayList;
import java.util.List;

public class A {

    public static void main(String[] args){
        List<B> b = new ArrayList<>();
        test(b);
    }

    private static void test(List<C> c){

    }

}

class B extends C{

}

class C{

}

这时候会报错:

test
(java.util.List<com.test.Extends.C>)
in A cannot be applied
to
(java.util.List<com.test.Extends.B>)
 

实在不理解,请大家指教。
如果我就要传集合,有什么办法吗?

阅读 3.3k
5 个回答

参数修改为

 private static void test(List<? extends C> c){

 }

解决你的问题。

为什么直接类可以:

这是普通的继承关系,自然没问题

为什么集合不可以:

这是类型转换,是两码事。

这种情况下应该这样声明:

private static void test(List<? extends C> c) { }

关于这个你可以参考一下这篇知乎回答

基础的知识层主Java泛型,还是需要多看看书Java编程思想等,一句话:泛型是不具有继承性的,Java类的多态性不能强行安插到泛型上。

你爸爸的财产你可以继承,你爸爸的公司的财产不能被你的公司继承,也就不存在多态性了。

继承和类型转换是两码事,应该这样声明:、
private static void test(List<? extends C> c) { }

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题