例項化泛型型別
由於型別擦除,以下將不起作用:
public <T> void genericMethod() {
T t = new T(); // Can not instantiate the type T.
}
T 型別被刪除。因為在執行時,JVM 不知道 T 最初是什麼,所以它不知道要呼叫哪個建構函式。
解決方法
-
呼叫
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
-
傳遞對
T的建構函式的引用 :public <T> void genericMethod(Supplier<T> cons) { T t = cons.get(); }genericMethod(String::new);