我刚开始使用Java Generics,以下代码对我没有任何意义。
List<? extends Number> lint = new ArrayList<Integer>();
// following throws error
List<Number> lint2 = lint;
我知道List<Interger> != List<Number>
但有什么用'?'接线员呢?我创建了一个整数的arraylist,我传递给一些List,它可以接受包含双精度数,浮点数或整数的列表。为什么我不能将它分配给List。所有这些都可归因于严格类型安全?
我将此作为参考:http://docs.oracle.com/javase/tutorial/java/generics/upperBounded.html
答案 0 :(得分:6)
容易,
List<Integer>
不是List<Number>
的子类型,即使是Integer
子类型Number
。
将Number
(? extends Number
)的任何子类设为Integer
。
答案 1 :(得分:2)
原因很简单:lint
是ArraysList<Integer>
lint.add(10)
是正确的,lint.add(2.5)
是错误的。
但是如果Java编译器接受List<Number> lint2 = lint;
,lint2.add(2.5)
应该是可以接受的,因为2.5
是Number
并且允许将Double
放入列表Integer
。
希望现在更清楚......
答案 2 :(得分:1)
/ **抽象类Number是类BigDecimal,BigInteger,Byte,Double,Float,Integer,Long和Short的超类。 * /
/ ** Number的子类必须提供将表示的数值转换为byte,double,float,int,long和short的方法。
所以你必须输入cast * /
List<? extends Number> lint = new ArrayList<Integer>();
List<Number> lint2 = (List<Number>) lint;
lint2.add(123);
lint2.add(1234);
System.out.println(lint2);
答案 3 :(得分:0)
lint的类型为ArrayList() 和lint2是List()的类型 在这里你可以说ArrayList是List的子类,所以
List l1 = new ArrayList();
并且类似于Integer是Number的子类,所以
Number i = new Integer(5);
但是List<Number> != List<Integer>
这就是它给出错误的原因。
他们是不同的。
答案 4 :(得分:0)
在lint2中,可以添加Number的任何子节点。 在皮棉没有这样的事情;因为一个人不知道具体的?。
lint.add(new Integer(3000)); // Error too
因此将“?extends T”读作特定(未知)类型。仅用于阅读数字,而不是写作。
答案 5 :(得分:0)
List<Number>
和List<? extends Number>
。因此,您无法直接将lint
分配给lint2
,您应该将其转换为List<Number>
类型。