如何将泛型类传递给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
中添加不是adding11ѭ类型的对象。在您的情况下,这可能是安全的,因此您仍然可以使用泛型而不必使用
ArrayList<?>
。     

要回复问题请先登录注册