在java中实例化泛型类型

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (216)

Java泛型为什么这不起作用 在Java中实例化一个泛型类

我想在java中创建一个泛型类型的对象。请建议我如何实现相同。

注意:这可能看起来是一个微不足道的泛型问题。但我敢打赌,事实并非如此。:)

假设我有这样的类声明:

public class Abc<T> {
    public T getInstanceOfT() {
       // I want to create an instance of T and return the same.
    }
}
提问于
用户回答回答于
public class Abc<T> {
    public T getInstanceOfT(Class<T> aClass) {
       return aClass.newInstance();
    }
}

你将不得不添加异常处理。

必须在运行时传递实际类型,因为它不是编译后的字节代码的一部分,所以没有明确提供它就无法知道它。

用户回答回答于

在你发布的代码中,不可能创建一个实例,T因为你不知道它是什么类型:

public class Abc<T>
{
       public T getInstanceOfT()
       {
           // There is no way to create an instance of T here
           // since we don't know its type
       }
} 

当然,如果你有一个引用Class<T>并且T有一个默认的构造函数,就可以调用newInstance()这个Class对象。

如果你继承子类,Abc<T>你甚至可以解决类型擦除问题,并且不必传递任何Class<T>引用:

import java.lang.reflect.ParameterizedType;

public class Abc<T>
{
    T getInstanceOfT()
    {
        ParameterizedType superClass = (ParameterizedType) getClass().getGenericSuperclass();
        Class<T> type = (Class<T>) superClass.getActualTypeArguments()[0];
        try
        {
            return type.newInstance();
        }
        catch (Exception e)
        {
            // Oops, no default constructor
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args)
    {
        String instance = new SubClass().getInstanceOfT();
        System.out.println(instance.getClass());
    }
}

class SubClass
    extends Abc<String>
{
}

扫码关注云+社区