簡體   English   中英

如何在java中創建泛型類的實例?

[英]How to create an instance of an generic class in java?

我想知道是否可以創建一個構造函數:


public <C, T> C newInstance(Class<C> constructor_class,
                              Class<T> type,
                              Object...parameters){
     // create a new Instance with the generic type and the paramters
     
     //so basicly like this, but with generics and parameters
     return constructor_class.newInstance();
}


你基本上不能。 你的例子壞了 - type應該代表什么?

假設您想動態創建一個HashMap<String, Integer> 這將要求您傳入HashMap.classString.classInteger.class ,但我們立即遇到了大量問題:

  • 我們怎么知道 HashMap 有 2 個參數? 我們沒有,因此您必須通過可變參數傳遞 2 個類引用,並且在運行時我想如果您傳遞了錯誤數量的類,我們會拋出異常。
  • 如果你通過 Map,它根本無法實例化怎么辦?
  • 但最重要的是,這完全沒用,沒有出現在方法/字段/類簽名中的泛型是編譯器想象的虛構:javac 在編譯期間使用它來警告或錯誤,以及生成不可見的種姓操作,以及然后把這些信息扔掉 通過動態執行,所有“在編譯時”的東西都不能按照定義工作(我們正在編譯,而不是運行,重點是類型是動態的,所以 javac 不能這樣做),所以對 javac 來說它是無用的,然后信息被丟棄。 所以這讓它完全沒用,然后,不是嗎?

此外, Class不能用於傳達泛型參數。 如果我想要一個HashMap<List<String>, Integer>呢? List<String>不作為類文字存在,因此這里不能使用java.lang.Class<T> 還有一些類對象(特別是int.class )在泛型中是不合法的。 那么,我們有? , ? super Foo ? super Foo , A, B extends A, C extends A & Serializable , List<String>都作為可以進入<>但不能是java.lang.Class引用的東西的例子,以及合法的int.class類 ref 但不能進入<> 你不能把方釘放在圓孔里。 更不用說即使可以,它實際上也絕對不會做任何事情的事實(請參閱第 3 點:這是無用的 - 大多數泛型,絕對是您在這里使用的泛型,會影響編譯並在之后不復存在)。

在這個領域有一些瘋狂的黑客(例如超級類型令牌),但是如果你不完全理解泛型在底層是如何工作的,那么你將能夠有用地使用這些黑客的機會為 0.00001% 或更少,所以不要'在那之前不要打擾。 提出這個問題,尤其是使用那個偽代碼,強烈表明你對它的了解還不夠。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM