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.