我編寫了這個簡單的測試代碼,通過調整一本書的內容來幫助我理解Java中泛型方法的工作。我標記的行是假設工作,爲什麼不是?通用方法失敗
import java.util.*;
class Test {
public static void main(String args[]){
List<Number> input = null;
List<Number> output=null;
output = Test.process(input); // fail, why??
}
public static <E extends Number> List <? super E> process (List <E> nums){
List <E>eList = new ArrayList<E>();
return eList;
}
}
編輯:嗯,代碼改變List<? super E>
到List<E>
時的作品,這是偉大的,但我仍然不知道我可能已經錯過了一些東西,或者如果我把這個從書中可能有錯誤。因爲它似乎有請閱讀問題:
- 鑑於聲明的方法:
公共靜態<é擴展號碼>列表 <?超級E>進程(名單NUMS)
程序員想要使用此方法是這樣的:
// INSERT DECLARATIONS HERE
output = process(input);
這對聲明可以被放置在// INSERT DECLARATIONS這裏允許 代碼編譯? (選擇所有適用的。)
A. ArrayList<Integer> input = null;
ArrayList<Integer> output = null;
B. ArrayList<Integer> input = null;
List<Integer> output = null;
C. ArrayList<Integer> input = null;
List<Number> output = null;
D. List<Number> input = null;
ArrayList<Integer> output = null;
E. List<Number> input = null;
List<Number> output = null;
F. List<Integer> input = null;
List<Integer> output = null;
G. None of the above.
答案:B,E和F是正確的。 過程的返回類型肯定被聲明爲List
而不是ArrayList
,所以A和D 是錯誤的。 C是錯誤的,因爲返回類型的計算結果爲List<Integer>
,而不能將 分配給List<Number>
類型的變量。當然,所有這些可能會導致 NullPointerException
,因爲變量仍然爲空 - 但問題只是要求我們 獲取代碼進行編譯。對書中提到的選項
都沒有在我的代碼工作。我可以安全地將它標記爲Kathy Sierra的錯誤,還是我在這裏錯過了一些東西?
也許你的代碼示例的簡短解釋? :) – 2009-02-18 03:24:00
噢.. 你爲什麼拿走名單 super E>? – andandandand 2009-02-18 03:25:43