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
就会产生结果。
添加回答
举报