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.