簡體   English   中英

使用反射實例化類型參數的對象

[英]Instantiating an object of a type parameter using reflections

我知道在使用泛型時,我們無法實例化未知類型的對象,即聲明:T var = new T() 將給出編譯時錯誤,我在一些搜索后使用 Reflections 嘗試過它,但它沒有編譯並給我我會在最后提到的錯誤

代碼 :

public class HelloWorld{
     public static void main(String []args){
        Pair<Integer> obj = new Pair<Integer>(Integer.class);
                            obj.<Integer>func();             
    }
}
class Pair<T>
{
    T  var;
   <T> Pair(){}
   <T> Pair(Class<T> reflection){
             var = reflection.newInstance() ;  
             }

   <T> void func(){
   System.out.println(var);
   }
}

錯誤 :

HelloWorld.java:12: error: incompatible types: T#1 cannot be converted to T#2
             var = reflection.newInstance() ;  
                                         ^
  where T#1,T#2 are type-variables:
    T#1 extends Object declared in constructor <T#1>Pair(Class<T#1>)
    T#2 extends Object declared in class Pair

我試圖找到錯誤的原因,但無法找到它

class Pair<T>
{
    T  var;
   <T> Pair(){}
   <T> Pair(Class<T> reflection){
             var = reflection.newInstance() ;  
             }

   <T> void func(){
   System.out.println(var);
   }
}

構造函數和方法上的<T>定義了另一個類型變量,該變量隱藏了類中的變量。 它們都被稱為“ T ”,但它們是不同的類型。

(零參數構造函數和func那些無論如何都沒有使用)。

刪除這些額外的類型變量聲明。

class Pair<T> {
  T var;

  Pair() {}

  Pair(Class<T> reflection) {
    var = reflection.newInstance();
  }

  void func() {
    System.out.println(var);
  }
}

然后你只需要處理這樣一個事實,即並非所有類都有可訪問的零參數構造函數; 並且newInstance()會拋出您需要處理的已檢查異常。

更好的方法是提供一個Supplier<T>

  Pair(Supplier<T> reflection) {
    var = reflection.get();
  }

暫無
暫無

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

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