![](/img/trans.png)
[英]How to write a generic method that takes two arguments of the same types in java?
[英]Handle specific types in a generic method takes and returns the same generic type
我有一個通用方法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
有沒有一種方法可以解決這種情況而無需采取不受約束的演員表?
我在代碼中實際上正在做什么:在應用程序中,有一個通用接口用於封裝一些值。 該接口針對不同的值類型有不同的專門實現,而我嘗試編寫的方法應動態選擇正確的實現。
如果您在運行時對a
進行類型檢查,那么您將擊敗泛型。 但是泛型無論如何都不能與數學運算符一起使用,因為這些運算符與基元一起使用,而類型參數與引用類型一起使用。 您的解決方法不適用於編譯器,因為T
在編譯時可以是任何Number
類型,因此當編譯器認為它可能是任何Number
類型時,不允許它返回Integer
。
取而代之的是,我將重載兩個非泛型的foo
方法-一個使用int
,另一個使用double
。 這些方法都不是通用的,每個方法都只會執行自己的操作。
這不是泛型的正確使用。 您應該使用方法重載
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.