2014-12-01 19 views
0

我有一個通用方法T foo(T),它根據參數的實際類型執行不同的操作。以下是一個說明同樣問題的例子。 (見下文對什麼我實際上做在我的代碼的描述。)處理通用方法中的特定類型需要並返回相同的通用類型

<T extends Number> T foo(T a) { 
    if (a instanceof Integer) { 
     return ((Integer) a) + 1; 
    } else if (a instanceof Double) { 
     return ((Double) a) + 1; 
    } else { 
     throw new IllegalArgumentException(); 
    } 
} 

這並不違反返回類型的要求,但它不是由javac接受。問題是例如return ((Integer) a) + 1;只會在TInteger時執行,但編譯器無法(根據JLS)推斷此操作,因此預計將T傳遞給return。該表達式的輸入爲int,不能轉換爲T

有沒有辦法解決這種情況,而不訴諸於未經檢查的演員?


我在我的代碼中實際做了什麼:在應用程序中,有一個通用接口用於封裝某些值。對於不同的值類型,該接口有不同的專用實現,我試圖編寫的方法應該動態選擇正確的實現。

回答

3

如果您在運行時鍵入檢查a,那麼您正在擊敗泛型的點。但泛型不適用於數學運算符,因爲這些運算符使用基元和類型參數處理引用類型。由於T在編譯時可能是Number類型,因此編譯器在它認爲它可能是任何Number類型時不允許您返回Integer

相反,我會重載兩個非泛型foo方法 - 一個使用int,另一個使用double。這些方法都不是通用的,每個方法都可以執行自己的操作。

相關問題