2 回答
TA貢獻(xiàn)1862條經(jīng)驗 獲得超7個贊
您遇到的問題是因為沒有為+定義運算符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。它們是否在運行時(或其他什么)并不重要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在所有Numbers 之間實現(xiàn)并且性能并不比強制轉(zhuǎn)換為BigDecimal.
添加回答
舉報
