构造泛型类型的对象

时间:2014-01-11 18:30:00

标签: java generics

一个方法以类cls作为参数,我需要实例化一个cls对象。 如下:

private void foo(Class<?> cls){
  cls bar = new cls();
  ...
}

例如,假设cls是Integer.class(但解决方案适用于任何类)。 如何在该方法中实例化一个Integer?

4 个答案:

答案 0 :(得分:1)

您可以检查类型并创建一个新整数:

if(cls == Integer.class) return Integer.valueOf(0);

if(cls == Integer.class) {
    return cls.getConstructor(int.class).newInstance(0);
}

但是,此方法仍会返回一个对象,而不是Integer的实例。

更好的选择可能是:

static <T extends Number> T newNumber1(Class<T> tClass, String s){
    if(tClass == Integer.class){
        return (T) Integer.valueOf(s);
    }
}

// OR

static Number newNumber2(Class<? extends Number> tClass, String s){
    if(tClass == Integer.class){
        return Integer.valueOf(s);
    }
}

用法:

int v1 = newNumber1(Integer.class, "5");
int v2 = newNumber2(Integer.class, "6").intValue();

<强>更新

static <T> T newInstance(Class<T> tClass, String s) throws Exception{
    return tClass.getConstructor(String.class).newInstance(s);
}

public static void main(String[] args) throws Exception{
    Double d = newInstance(Double.class, "4");
    System.out.println(d);
}

答案 1 :(得分:1)

由于Integer类没有0-arg构造函数,因此您无法在此处直接使用Class#newInstance()方法。

相反,您可以使用Class#getConstructor()方法获取Stringint参数的相应构造函数。然后使用以下方法创建实例:

Class<Integer> clazz = Integer.class;
Integer value = clazz.getConstructor(String.class).newInstance("5");

答案 2 :(得分:-1)

我假设您一直在询问一般情况 - 如何创建一个传递给这种方法的类的实例。显然,如果您只是意味着&#34;我如何创建Integer&#34;,那么它与该方法无关。

来自Javadoc for Class

public T newInstance()
          throws InstantiationException,
                 IllegalAccessException
  

创建此Class对象表示的类的新实例。该类实例化为具有空参数列表的新表达式。如果尚未初始化,则初始化该类。

显然,这对Integer不起作用,因为Integer没有带有空参数列表的构造函数。

答案 3 :(得分:-1)

如果你在反射方法中使用它,我认为你应该使用

Integer.TYPE