2015-03-13 20 views
3

我有例如:有趣的行为通配符

public static <T extends Number> void doJob(List<T> pr,List<? extends Number> en,T tel){ 
      // 
      System.out.println(pr.get(0).intValue()); 

    } 

List<? extends Integer> intList=new ArrayList<>(); 
Integer inval=200; 
List<Integer> intList3=new ArrayList<Integer>(Arrays.asList(1,2,3)); 
doJob(intList3,intList,inval);//it is allowed 
intList=intList3; 
doJob(intList,intList,intList.get(0));//IT IS FORBIDDEN 

为什么 doJob的编译器禁止不调用(intList中,intList中,intList.get(0));甚至intList实际上是 列表类型?

回答

3

那么这是因为,最终你正在做的:

List<? extends Integer> ls = new ArrayList<Integer>(); 
doJob(ls,ls,ls.get(0)); 

所以LS(或您的intList)实际上是一个未知类型的列表。但是你知道的是,这种未知类型延伸到Number

因此,当您拨打doJob,TdoJob成为此未知类型。你的第二个参数匹配为List<? extends Number>是一个超类型到List<? extends Integer>

根据你的第三个参数,我们已经知道T是未知的,你尝试通过intList.get(0)。现在intList.get将返回? extends Integer,即另一个未知类型(其扩展整数)。所以你试着将一个未知类型传递给一个期望未知类型的方法。而且两个未知的人不能保证是平等的。因此错误。

+0

看来你是对的,因为我试图定义另一种方法:public static void doanotherJob(List pr,List <?extends Number> en)。在这种情况下,它可以与doanotherJob(intList,intList)一起使用;谢谢。 – 2015-03-13 11:46:55

+0

谢谢。但是,在我得到15分的声望之前,你需要等待一小会儿才能够成功。 :-( – 2015-03-16 11:03:31