在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()
方法每次只允许相同类型或子类型的对象。正如我在回答中提到的,如果您将代码更改为listlist
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>();