如何从参数化List <T>创建Generic Type T的新对象

May*_*day 5 java generics

我有以下java示例类:

public class TestClass {

    public static <T> void method(List<T> objects) throws Exception {
        for (int i = 0; i < objects.size(); i++) {
            // Create new object of the same class
            T obj = (T) objects.get(i).getClass().newInstance();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它正在产生一个编译器警告:

类型安全:未捕获来自捕获#1​​的投射?将Object扩展为T.

如果我这样做,我可以完美地获得确切的T对象:

T obj = objects.get(i);
Run Code Online (Sandbox Code Playgroud)

它完全知道是T型.

为什么我无法创建该类的新实例?我该怎么办呢?

(我不是在寻找类型的回复:'添加@SuppressWarnings("未选中")')

Imp*_*Fox 11

这是因为getClass()返回a Class<? extends Object>.你不能(安全地)将通配符转换?为任何东西,甚至不是通用的类类型.这是Java Generics的限制.但由于您可以确定此警告不是问题,因此您可以放心地忽略或禁止它.


但这是一个解决方法,许多应用程序和库执行此操作:

public static <T> void method(List<T> objects, Class<T> clazz) throws Exception {
    for (int i = 0; i < objects.size(); i++) {
        // Create new object of the same class
        T obj = clazz.newInstance();
    }
}
Run Code Online (Sandbox Code Playgroud)