[英]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.