2017-05-29 51 views
-2

從我的最後一個問題here繼:定義通用對象

我有一個類,像這樣:

public class nVector<T extends nVector<?>> { 

    int i; 

    public T add(T a) { 

    } 

} 

,並希望出現以下情況:

public T add(T a) { 
    T b = this.clone(); 
    b.i += a.i; 
    return b; 
} 

不過的實例通用類型T是不允許的。然而,我可以很容易地在我的論點中包含一個T的實例。

我這樣做是因爲我有多個T類型的子類,它們繼承了nVector中的所有方法,並在「封閉環境」中自行處理。 (即他們只把自己的類型作爲參數,而不是其他孩子)

有什麼辦法解決這個問題?問題是,我返回類型T,而不是nVector<?>

+0

是'T'應該是元素類型?爲什麼宣佈'T擴展nVector '? – user2357112

+0

請在問題本身中包含必要的上下文,而不是僅僅鏈接到其他問題。例如,這個問題缺少這樣一個關鍵的上下文,即這個類被定義爲'public class Child extends nvector ',並且'this'實際上是'T'的一個實例。 – user2357112

+0

'public nVector >'由於缺少關鍵字而無法編譯。類型名稱不符合。 「NVector」的元素類型本身是「NVector」?不應該使用通配符。你想'公共接口NVector >'或類似的東西,假設你實際上意味着這個類型的工作方式類似於Enum和Comparable。 –

回答

2

您可以將Class<T>傳遞給nVector構造函數。然後使用cls.newInstance()。喜歡的東西,

public class nVector<T extends nVector<?>> { 
    Class<T> cls; 
    int i; // <-- default value 0. Should probably be set in the constructor 
      //  or with a setter method. 
    public nVector(Class<T> cls) { 
     this.cls = cls; 
    } 

    public T add(T a) { 
     T b = null; 
     try { 
      b = cls.newInstance(); 
      b.i = this.i + a.i; // <-- equivalent, thx @LukeLee 
     } catch (InstantiationException | IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
     return b; 
    } 
} 

當然,如果你需要的是T返回 - 你可以只return a;

+1

OP將添加兩個數字「this.i」和「a.i」。 –

+0

美麗!謝謝。然後我可以從childrne設置'cls'變量。 – finnrayment

+0

嗨Elliot,快速的問題,我試圖用'instanceof'檢查'T'類型,格式爲'if(obj instanceof T){}'但是它會拋出一個錯誤。有沒有什麼辦法可以執行上面的檢查,如果成功,我們可以成功地輸入'T'? – finnrayment