2015-03-13 22 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