[英]How can I pass a generic class to a method in Java?
假設我們有一個函數創建給定特定類的對象:
public static <T> T createObject(Class<T> generic) {
try {
return generic.newInstance();
} catch (Exception ex) {
return null;
}
}
我們可以輕松地使用該函數來創建非泛型類型的實例。
public static void main(String[] args) {
Foo x = createObject(Foo.class);
}
是否可以使用泛型類型執行相同的操作?
public static void main(String[] args) {
ArrayList<Foo> x = createObject(ArrayList<Foo>.class); // compiler error
}
Java中的泛型是通過類型擦除實現的。
這意味着ArrayList<T>
在運行時是一個ArrayList
。 編譯器只是為您插入強制轉換。
您可以使用以下方法測試:
ArrayList<Integer> first = new ArrayList<Integer>();
ArrayList<Float> second = new ArrayList<Float>();
if(first.getClass() == second.getClass())
{
// should step in the if
}
此外,只要您確定自己在做什么,只要您非常確定您的代碼不會產生堆污染,您就可以取消警告。
您還可以考慮到您的代碼無法實例化數組,這偶然也需要一個未經檢查的異常:
@SuppressWarnings("unchecked")
public static <T> T[] createArray(Class<T> anyClass, int size){
T[]result = null;
try{
result = (T[]) Array.newInstance(anyClass, size);
}catch(Exception e){
e.printStackTrace();
}
return result;
}
這就是我使用它的方式:
public static void main(String[] args) throws Exception{
@SuppressWarnings("unchecked")
List<String> jediNames = (List<String>) createObject(ArrayList.class);
jediNames.add("Obiwan");
String[] moreJedis = createArray(String.class, 10);
System.out.println(moreJedis.length);
moreJedis[0] = "Anakin";
}
如果你真的需要,你可以強制它編譯沒有錯誤或警告:
@SuppressWarnings("unchecked")
ArrayList<Foo> x = (ArrayList<Foo>) createObject(ArrayList.class);
唯一的麻煩是,在編譯時,它不能保證createObject()
不會向ArrayList
添加非Foo
類型的對象。 在您的情況下,這可能是安全的,因此您仍然可以獲得泛型的好處而無需使用ArrayList<?>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.