2016-01-14 20 views
0

我嘗試了下面的代碼,很少和泛型混淆。您能否提供以下方法中用'T'取代什麼值的信息?Java泛型中方法參數類型爲<? extends T>時T的值是多少?

代碼:

public class testT{ 

public static void main(String[] args){ 

List<Number> numbers1 = new ArrayList<>(); 
     numbers1.add(5.4); 
     numbers1.add(2); 
     numbers1.add(44444444l); 
     getClass(numbers1); 
} 

static <T> void getClass(Collection<? extends T> collection) { 
    for(T c : collection) { 
     System.out.println(c.getClass().getName()); 
    } 

} 

輸出:

java.lang.Double 
java.lang.Integer 
java.lang.Long 
+1

'T'會是'Number'。請注意,您實際上並不需要'T'來完成此代碼; '集合'和'對象'將工作相同。此外,''不是必需的,您可以等效地使用''。 –

+0

它的數量,如你低音數字集合 – kism3t

+0

@AndyTurner - 謝謝。我也認爲這裏相當於。但是在理解compler如何派生T = Number的時候很難理解,即當收集的參數傳遞給Collection 時,那麼我認爲這種情況可能會模棱兩可以找到T的值。 –

回答

0

<T>之前你的方法返回類型指示的通用方法。

反過來,可以在方法中的參數,其中你正在做參考T:你的唯一參數是一個類型Collection等於T或延伸它(成語? extends T限定上限爲T,並且使用通配符) 。

傳遞給你的方法getClassmain方法收集是Number S,在其中添加一個Double,一個IntegerLong(數字原語的對象封裝延伸Number)泛型集合。

這些類型是通過您通過add的實際值推斷和裝箱的。

由於getClass方法在運行時解析,因此您正在打印特定類型的集合元素。

+0

謝謝。但我試圖更多地瞭解如何導出值T = Number,將參數Collection 傳遞給Collection 。 –

+0

@AbhishekMJ您的方法將爲其給定參數採用任何參數化類型。你碰巧通過一個'List ',因此'T'是一個'Number'。 – Mena

相關問題