Java方法重载疑问:为何字面量未匹配byte/short类型方法?
关于Java方法重载中字面量匹配的问题解答
嘿,这个问题问得特别到位,刚好涉及到Java方法重载匹配规则和整数字面量默认类型的核心知识点,我来给你拆解清楚:
首先要明确一个关键规则:Java中所有不带后缀的整数字面量,默认类型都是int——哪怕这个数值落在byte(-128127)或者`short`(-3276832767)的范围内,比如你写的10,它本质上还是一个int类型的值,而非byte。
再来看方法重载的匹配逻辑:JVM在选择调用哪个重载方法时,优先级最高的是找到参数类型完全匹配的方法。你的代码里刚好有一个display(int num)方法,所以不管你传入的int字面量数值有多小,只要它是int类型,就会直接匹配这个方法,根本不会去考虑能不能转成byte或者short。
为什么不会自动转成byte?因为从int转成byte属于缩小转换,可能会丢失精度(比如128转成byte就会变成-128),Java不会自动执行这种有风险的转换。只有扩大转换(比如int转long)会在没有完全匹配的方法时被考虑,但这里有int的方法,所以轮不到其他类型的重载方法。
那如果想要调用display(byte num)该怎么做?你需要把字面量显式强制转换成byte类型,比如:
sample.display((byte)10);
这样参数类型就是byte了,JVM就会匹配对应的方法。
最后对应你的代码输出逐个分析:
sample.display(10):10是int字面量,匹配display(int)→ 输出under intsample.display(128):128是int字面量(哪怕超出byte范围),还是匹配display(int)→ 输出under intsample.display(134572):同样是int字面量,匹配display(int)→ 输出under intsample.display(65757l):这里的l后缀把字面量标记为long类型,完全匹配display(long)→ 输出under long
内容的提问来源于stack exchange,提问作者Manjunath H M
相关产品推荐
相关产品推荐

