例項化泛型型別

由於型別擦除,以下將不起作用:

public <T> void genericMethod() {
    T t = new T(); // Can not instantiate the type T.
}

T 型別被刪除。因為在執行時,JVM 不知道 T 最初是什麼,所以它不知道要呼叫哪個建構函式。

解決方法

  1. 呼叫 genericMethod 時傳遞 T 的類:

    public <T> void genericMethod(Class<T> cls) {
        try {
            T t = cls.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
             System.err.println("Could not instantiate: " + cls.getName());
        }
    }
    
    genericMethod(String.class);
    

    這會引發異常,因為無法知道傳遞的類是否具有可訪問的預設建構函式。

Version >= Java SE 8

  1. 傳遞對 T 的建構函式的引用

    public <T> void genericMethod(Supplier<T> cons) {
        T t = cons.get();
    }
    
    genericMethod(String::new);