2 回答

TA貢獻(xiàn)1862條經(jīng)驗 獲得超7個贊
您遇到的問題是因為沒有為+
定義運(yùn)算符Number
,只有 的特定子類Number
。例如,+
是為 等定義的Integer
,Double
但不是BigInteger
,BigDecimal
或 的任何其他非標(biāo)準(zhǔn)實現(xiàn)Number
。
沒有很好的方法來進(jìn)行泛型加法。您最終不得不提供一個BinaryOperator<S>
,因此您的代碼如下所示:
sum(1, 2, Integer::sum); sum(1.0, 2.0, Double::sum);
這比僅僅更冗長:
1 + 2 1.0 + 2.0
需要+
為 和 的編譯時類型定義編譯v1
器v2
。它們是否在運(yùn)行時(或其他什么)并不重要Integer
:是否允許+
由編譯器決定,因為它必須能夠保證該方法對于任何參數(shù)都是類型安全的。
上面的方法編譯成這樣:
public static final Number sum(Number v1, Number v2){ System.out.printf("v1=%1$s,v2=%2$s%n",v1.getClass(),v2.getClass()); return v1+v2; }
這稱為類型擦除。
如果+
沒有為 a 定義Number
,則不允許使用此代碼。

TA貢獻(xiàn)1780條經(jīng)驗 獲得超1個贊
作為所有內(nèi)置Number
擴(kuò)展的通用解決方案:
public static Number sum(final Number a, final Number b) { return new BigDecimal(a.toString()).add(new BigDecimal(b.toString())); }
(注意:不能保證toString()
會給出String
可解析的,BigDecimal
但據(jù)我所知,它適用于所有內(nèi)置的 JDKNumber
擴(kuò)展。)
如果你想做一些更聰明的事情,你可以做一些檢查instanceof
以找到輸入的類型并從那里開始工作,但我試過一次Comparable
在所有Number
s 之間實現(xiàn)并且性能并不比強(qiáng)制轉(zhuǎn)換為BigDecimal
.
添加回答
舉報