Java泛型不能使用实例

Java泛型不能使用实例

类型参数不能用于在方法中实例化其对象。

public static <T> void add(Box<T> box) {
   //compiler error
   //Cannot instantiate the type T
   //T item = new T();  
   //box.add(item);
}

如果要实现这样的功能,请使用反射。

public static <T> void add(Box<T> box, Class<T> clazz) 
   throws InstantiationException, IllegalAccessException{
   T item = clazz.newInstance();   // OK
   box.add(item);
   System.out.println("Item added.");
}

示例

创建一个名称为:NoInstance.java 文件,并编写以下代码 -

package demo5;

public class NoInstance {
    public static void main(String[] args) throws InstantiationException,
            IllegalAccessException {
        Box<String> stringBox = new Box<String>();
        add(stringBox, String.class);
    }

    public static <T> void add(Box<T> box) {
        // compiler error
        // Cannot instantiate the type T
        // T item = new T();
        // box.add(item);
    }

    public static <T> void add(Box<T> box, Class<T> clazz)
            throws InstantiationException, IllegalAccessException {
        T item = clazz.newInstance(); // OK
        box.add(item);
        System.out.println("Item has been added.");
    }
}

class Box<T> {
    private T t;

    public void add(T t) {
        this.t = t;
    }

    public T get() {
        return t;
    }
}

执行上面代码,得到输出结果如下 -

Item has been added.