在Java中如何将泛型类传递给方法?

在Java中如何将泛型类传递给方法?,java,generics,dynamic,methods,arguments,Java,Generics,Dynamic,Methods,Arguments,假设我们有一个函数,该函数创建给定特定类的对象: public static <T> T createObject(Class<T> generic) { try { return generic.newInstance(); } catch (Exception ex) { return null; } } 是否可以对泛型类型执行相同的操作 public static void main(String[] arg

假设我们有一个函数,该函数创建给定特定类的对象:

public static <T> T createObject(Class<T> generic) {
    try {
        return generic.newInstance();
    } catch (Exception ex) {
        return null;
    }
}
是否可以对泛型类型执行相同的操作

public static void main(String[] args) {
    ArrayList<Foo> x = createObject(ArrayList<Foo>.class); // compiler error
}
publicstaticvoidmain(字符串[]args){
ArrayList x=createObject(ArrayList.class);//编译器错误
}

Java中的泛型是通过类型擦除实现的

这意味着
ArrayList
在运行时是
ArrayList
。编译器只是为您插入强制转换

您可以通过以下方法对此进行测试:

ArrayList<Integer> first = new ArrayList<Integer>();
ArrayList<Float> second = new ArrayList<Float>();

if(first.getClass() == second.getClass())
{
    // should step in the if
}
ArrayList first=new ArrayList();
ArrayList second=新的ArrayList();
if(first.getClass()=second.getClass())
{
//是否应该介入if
}

如果确实需要,您可以强制编译它,而不出现错误或警告:

@SuppressWarnings("unchecked")
ArrayList<Foo> x = (ArrayList<Foo>) createObject(ArrayList.class);
@SuppressWarnings(“未选中”)
ArrayList x=(ArrayList)createObject(ArrayList.class);

唯一的问题是,在编译时,它不能保证
createObject()
没有向
ArrayList
添加非
Foo
类型的对象。在您的情况下,这可能是安全的,因此您仍然可以获得泛型的好处,而无需使用
ArrayList

此外,只要您确定自己在做什么,并且只要您非常确定您的代码不会引起堆污染,您就可以抑制警告

您还可以考虑,您的代码无法实例化数组,这可能还需要一个未检查的异常:

@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;
}
@SuppressWarnings(“未选中”)
公共静态T[]createArray(类anyClass,int size){
T[]结果=null;
试一试{
结果=(T[])Array.newInstance(anyClass,size);
}捕获(例外e){
e、 printStackTrace();
}
返回结果;
}
我就是这样使用它的:

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";
}
publicstaticvoidmain(字符串[]args)引发异常{
@抑制警告(“未选中”)
List-name=(List)createObject(ArrayList.class);
添加(“欧比旺”);
String[]moreJedis=createArray(String.class,10);
System.out.println(moreJedis.length);
莫尔绝地[0]=“阿纳金”;
}

该问题可能是由于类型擦除造成的:
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";
}