是否有可能在Java中反射性地實例化泛型類型?使用描述的技術here我收到錯誤,因爲類令牌不能通用。以下面的例子。我想實例化實現Creator的Creator的一些子類。實際的類名稱作爲命令行參數傳入。這個想法是能夠在運行時指定Creator的實現。有沒有另一種方法來完成我在這裏要做的事情?可以反思性地實例化java中的泛型類型嗎?
public interface Creator<T> {
T create();
}
public class StringCreator implements Creator<String> {
public String create() { return new String(); }
}
public class FancyStringCreator implements Creator<String> {
public String create() { return new StringBuffer().toString(); }
}
public static void main(String[] args) throws Exception {
Class<?> someClass = Class.forName(args[0]);
/*ERROR*/Class<? extends Creator<String>> creatorClass = someClass.asSubclass(Creator.class);
Constructor<? extends Creator<String>> creatorCtor = creatorClass.getConstructor((Class<?>[]) null);
Creator<String> creator = creatorCtor.newInstance((Object[]) null);
}
編輯:我喜歡馬庫斯的方法,因爲它是最簡單實用的方法,沒有規避整體的泛型。我可以在我的情況中使用它,因爲我可以指定傳遞的類必須是StringCreator的子類。但是正如Ericson所指出的那樣,通用信息仍然存在於類型級別,而不是在運行級別,所以仍然可以反思性地檢查給定的類是否實現了正確的泛型類型。
並非所有通用信息在運行時都會丟失;即使沒有創建另一個界面,也有足夠的時間檢查必要的類型信息。只是沒有足夠的信息讓編譯器推斷正確性。 – erickson 2008-12-10 19:48:48