Java Generics中的以下任务有什么问题

时间:2014-10-14 10:31:24

标签: java generics

我刚开始使用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

6 个答案:

答案 0 :(得分:6)

容易,

  

List<Integer>不是List<Number>的子类型,即使是Integer   子类型Number

Number? extends Number)的任何子类设为Integer

enter image description here

查看更多Generics, Inheritance, and Subtypes

答案 1 :(得分:2)

原因很简单:lintArraysList<Integer> lint.add(10)是正确的,lint.add(2.5)是错误的。

但是如果Java编译器接受List<Number> lint2 = lint;lint2.add(2.5)应该是可以接受的,因为2.5Number并且允许将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>类型。