我有一個通用方法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;
只會在T
爲Integer
時執行,但編譯器無法(根據JLS)推斷此操作,因此預計將T
傳遞給return
。該表達式的輸入爲int
,不能轉換爲T
。
有沒有辦法解決這種情況,而不訴諸於未經檢查的演員?
我在我的代碼中實際做了什麼:在應用程序中,有一個通用接口用於封裝某些值。對於不同的值類型,該接口有不同的專用實現,我試圖編寫的方法應該動態選擇正確的實現。
我只知道運行時的類型,因此方法重載不起作用。 – Feuermurmel 2014-12-01 22:14:11