在java中为整数列表分配双精度

在java中为整数列表分配双精度,java,generics,Java,Generics,在以下代码段中: List<Integer> ints = new ArrayList<Integer>(); ints.add(1); ints.add(2); List<? extends Number> nums1 = ints; ints.add(3); ints.add(4); System.out.println("nums1 : " +

在以下代码段中:

        List<Integer> ints = new ArrayList<Integer>();
        ints.add(1);
        ints.add(2);
        List<? extends Number> nums1 = ints;
        ints.add(3);
        ints.add(4);
        System.out.println("nums1 : " + nums1);
        List<? super Number> nums2 = (List<? super Number>) nums1;
        nums2.add(5.381);
        nums2.add(6);
        //ints.add(7.61762); // compilation error
        System.out.println("nums2 : " + nums2);
        System.out.println("ints : " + ints);
List ints=new ArrayList();
加入(1);
内加(2);

列出输出是正确的,因为在运行时会发生类型擦除


您已经创建了3个引用
List ints
List。因此,您的意思是,当System.out.println看到ints List时,它现在将其视为一个数字列表,而不是整数列表,从而使用小数点打印数字。我可以理解,出于某种推理,它插入了一个Double,但不明白为什么整个代码会进一步将其视为数字列表?您能运行一次示例并看到这个吗?
ints.add(7.61762)
将给出一个错误,因为您正试图向
列表int
添加一个双精度值。但是
nums2
可以有双值,因为
double
Integer
Number
的子类型,您应该记住
list.add()
方法每次只允许相同类型或子类型的对象。正如我在回答中提到的,如果您将代码更改为
list
list
List<? extends Number> eExtend = new ArrayList<Number>();  
List<? extends Number> eExtend = new ArrayList<Integer>();
List<? extends Number> eExtend = new ArrayList<Double>(); 
List<? super Integer> eSuper = new ArrayList<Integer>(); 
List<? super Integer> eSuper = new ArrayList<Number>();
List<? super Integer> eSuper = new ArrayList<Object>();
List<? super Number> eSuper = new ArrayList<Number>();