儘管我可以從更復雜的類結構中簡化該代碼,在真正的代碼中,我使用了這裏使用的整數和雙精度類型的子類型。使用Java泛型,類型參數和返回列表未經檢查的轉換警告
我正在嘗試將Java泛型與類型參數一起使用。如果用戶請求Number.class
的類型,我們希望將List<Integer>
列表和List<Double>
列表組合到一個列表中。
雖然代碼有效,但我無法駕馭未經檢查的轉換警告(請參閱TODO標記)。該警告是:
Type safety: Unchecked cast from List<Integer> to Collection<? extends T>
但是,如果我刪除了演員,我得到一個編譯錯誤:
The method addAll(Collection<? extends T>) in the type List<T> is not applicable for the arguments (List<Integer>).
我的代碼:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class Generics1 {
static final List<Integer> intList = new ArrayList<Integer>(Arrays.asList(
1, 2, 3, 4));
static final List<Double> dblList = new ArrayList<Double>(Arrays.asList(
1.1, 2.2, 3.3));
public static <T extends Number> List<T> getObjects(Class<T> type) {
List<T> outList = new ArrayList<T>();
if (type == Number.class) {
// user asked for everything
// TODO: unchecked cast warnings here should be fixed
outList.addAll((Collection<? extends T>) intList);
outList.addAll((Collection<? extends T>) dblList);
} else {
// user asked for subtype of number
if (Integer.class.isAssignableFrom(type)) for (Integer i : intList)
if (type.isInstance(i)) {
T obj = type.cast(i);
outList.add(obj);
}
if (Double.class.isAssignableFrom(type)) for (Double d : dblList)
if (type.isInstance(d)) {
T obj = type.cast(d);
outList.add(obj);
}
}
return outList;
}
public static void main(String[] args) {
System.out.println("HI!");
System.out.println("integers: " + getObjects(Integer.class));
System.out.println("doubles: " + getObjects(Double.class));
System.out.println("numbers: " + getObjects(Number.class));
}
}
是SuppressWarnings( 「未登記」),夠嗎? – ninjalj 2010-09-24 19:00:24
我忘了提及,我編輯了這篇文章,將代碼塊中的泛型放置在錯誤消息中,以便您可以看到正在使用的泛型類型。 – Powerlord 2010-09-24 20:04:10
感謝您編輯帖子。 – 2010-09-25 02:05:11