例項化泛型型別
由於型別擦除,以下將不起作用:
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);