第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 泛型無法編譯

Java 泛型無法編譯

慕哥6287543 2022-12-28 14:21:01
public class GenMethodDemo{        public GenMethodDemo(){            Sum.<Integer,Integer,Integer>sum(1,2);               }        public static void main(String args[]){            new GenMethodDemo();        }    }    class Sum{     public static final <S extends Number,Z extends S,X extends S> S sum(Z v1,X v2){            System.out.printf("v1=%1$s,v2=%2$s%n",v1.getClass(),v2.getClass());            return v1+v2;        }錯誤得到:error: bad operand types for binary operator '+'        return v1+v2;  first type:  Z  second type: X  where Z,S,X are type-variables:    Z extends S declared in method <S,Z,X>sum(Z,X)    S extends Number declared in method <S,Z,X>sum(Z,X)    X extends S declared in method <S,Z,X>sum(Z,X)1 error不明白我做錯了什么?如果我將 SZX 更改為 Integer - 一切正常,但為什么使用泛型代碼無法編譯?重構(gòu)代碼為:public class GenMethodDemo2{    public GenMethodDemo2(){        Sum.<Integer>sum(1,2);            }    public static void main(String args[]){        new GenMethodDemo2();    }}class Sum{    public static final <S extends Integer> S sum(S v1,S v2){        System.out.printf("v1=%1$s, v2=%2$s%n",v1.getClass(),v2.getClass());        return v1+v2;    }} error: incompatible types: int cannot be converted to S        return v1+v2;  where S is a type-variable:    S extends Integer declared in method <S>sum(S,S)1 error因此,S 應(yīng)該是 Integer 或 Integer 類的任何子類,以任何方式絕對應(yīng)該可以 + 它們的值。這個版本有什么問題?S extends Integer但是int cannot be converted to S,怎么可能呢?為什么沒有自動裝箱?
查看完整描述

2 回答

?
牧羊人nacy

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

需要+為 和 的編譯時類型定義編譯v1v2。它們是否在運(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,則不允許使用此代碼。


查看完整回答
反對 回復(fù) 2022-12-28
?
慕神8447489

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)并且性能并不比強(qiáng)制轉(zhuǎn)換為BigDecimal.


查看完整回答
反對 回復(fù) 2022-12-28
  • 2 回答
  • 0 關(guān)注
  • 122 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號