java 泛型 理解,这是什么原因

    public static class aaa   {
        public  void fun(List<? super Number> b) {
        }
    }
    public static class bbb<T>   {
        public  void fun(List<? super T> b) {
        }
    }

    public static void test() {
       // 这里传入子类报错 可以理解
        new aaa().fun(new ArrayList<Integer>());
       // 这里传入子类  为什么没有报错
        new <Number>bbb().fun(new ArrayList<Integer>());
    }


  1. 泛型为<? super Number> ,自然只能接收Number及其超类
  2. 泛型为<? super T>,自然只能接收T及其超类,至于你的调用new <Number>bbb(),这个一般叫做泛型构造方法,和你后面fun的传参有什么关系呢?说白了,你没有用到类的泛型定义<? super T>,你用的是构造方法的泛型,我想你应该是想写new bbb<Number>().fun(xxxxx)?

img

我简单改了一下,这样就不报错了,Number和Integer的问题

class aaa   {
     public  void fun(List<? super Integer> b) {
     }
 }
class bbb<T>   {
     public  void fun(List<? super T> b) {
     }
     public static void test() {
          // 这里传入子类报错 可以理解
           new aaa().fun(new ArrayList<Integer>());
          // 这里传入子类  为什么没有报错
           new <Number>bbb().fun(new ArrayList<Integer>());
       }
 }