Java泛型 - 获取类型

3

重复:在Java中实例化泛型类型

你好! 我是一位尝试使用Java的C#开发人员。那么我该如何在Java中执行以下操作。

在C#中:

public T create_an_instance_of<T>(){
  T instance = default (T);
 // here's usually some factory to create the implementation
   instance =  some_factory.build<T>();
 // or even..
   instance = some_factory.build(typeOf(T) );

 return instance;
}
4个回答

5
Java的泛型基于类型擦除。这使它们向下兼容,但意味着您不能使用类型参数本身,因为它在运行时不存在。
你能做的最接近的事情是这样的:
public <T> T create_an_instance_of(Class<T> c){
    return c.newInstance(); // or use constructors via reflection
}

记录一下,这段代码不会编译成功,因为出现了异常 ;) - Bozho
仅供参考,我并没有点踩。似乎所有答案都被踩了。 - Bozho

0
你不能在Java中这样做,因为泛型是非具体化的。你可以使用所谓的“类型令牌”,但它有局限性。
 static <T> T construct(Class<T> klazz) {
     try {
        return klazz.newInstance();
     } catch (InstantiationException e) {
        return null;
     } catch (IllegalAccessException e) {
        return null;
     }
 }

 System.out.println(construct(String.class).isEmpty()); // prints "true"

这里使用 Class<?>.newInstance() 通过反射构造对象,但并不总是成功的(例如当没有公共的无参构造函数时)。


0

尝试类似这样的内容:

public static <T> T createInstance(Class<T> clazz)
        throws IllegalArgumentException, SecurityException,
        InstantiationException, IllegalAccessException,
        InvocationTargetException, NoSuchMethodException {
    T ans = clazz.getConstructor().newInstance();
    return ans;
}

0
正确的选择是使用抽象工厂。只需传递它,它甚至可以创建没有公共无参构造函数的类的实例,或者接口类的适当实现类的实例。
反射在这里绝对是不必要的,也是错误的选择。

1
如果他想在系统中使用它的每种类型,那么抽象工厂将是不必要的开销。 - Bozho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接