3 回答

TA貢獻1815條經驗 獲得超13個贊
因此,如果您仔細閱讀用于在編譯時確定方法簽名的 Java 語言規范,就會清楚:
第一階段(第 15.12.2.2 節)執行重載解析,不允許裝箱或拆箱轉換或使用變量 arity 方法調用。如果在此階段沒有找到適用的方法,則處理繼續到第二階段。
第二階段(第 15.12.2.3 節)執行重載解析,同時允許裝箱和拆箱,但仍然阻止使用變量 arity 方法調用。如果在此階段沒有找到適用的方法,則處理繼續到第三階段。
第三階段(第 15.12.2.4 節)允許重載與可變數量方法、裝箱和拆箱相結合。
因此,從上述步驟中可以清楚地看出,在您的情況下,在第一階段,?Java 編譯器將找到一個匹配的方法,該方法可以執行doCalc(long a,long b)
.?您的方法doCalc(Byte s1, Byte s2)
在調用期間需要自動裝箱,因此它的優先級會降低。

TA貢獻1155條經驗 獲得超0個贊
在您的情況下發生的情況是,在運行時,JVM 選擇執行擴大轉換?byte -> long
,因為這種轉換更安全,因為可以保證它不會導致RuntimeException
.
從 轉換為byte
也Byte
稱為裝箱可能會導致OutOfMemoryError,因為 JVM 必須將新對象分配到堆上:
如果需要分配包裝類(Boolean、Byte、Character、Short、Integer、Long、Float 或 Double)之一的新實例并且可用存儲空間不足,則裝箱轉換可能會導致 OutOfMemoryError。
因此,首選更安全的byte -> long
?加寬轉換。

TA貢獻1786條經驗 獲得超13個贊
為了找到正確的過載,順序是:
按參數數量
裝箱/拆箱
可變參數
所以
如果
b
結果Byte
是Byte, Byte
.如果通過的話,
new byte[] { b, b }
結果就是byte, byte
。如果傳遞兩個字節 b,則可以從 byte擴展到 int 到 long,結果為
long, long
。當長長的超載被移除時,
Byte, Byte
就會產生結果。
添加回答
舉報