我在回答另一个问题时看到了这一点,参考了Java规范的缺点:
还有更多的缺点,这是一个微妙的话题.看看这个:
Run Code Online (Sandbox Code Playgroud)public class methodOverloading{ public static void hello(Integer x){ System.out.println("Integer"); } public static void hello(long x){ System.out.println("long"); } public static void main(String[] args){ int i = 5; hello(i); } }这里将打印"long"(我自己没有检查过),因为编译器会选择加宽自动装箱.使用自动装箱时要小心,或者根本不使用它!
我们是否确定这实际上是扩大而不是自动装箱的一个例子,还是完全不同于其他东西?
在我的初始扫描中,我同意声明输出i在声明为基元而不是对象的基础上"长" .但是,如果你改变了
hello(long x)
Run Code Online (Sandbox Code Playgroud)
至
hello(Long x)
Run Code Online (Sandbox Code Playgroud)
输出将打印"整数"
这里到底发生了什么?我对java的编译器/字节码解释器一无所知...
我正在准备进行SCJP考试,在学习拓宽部分的时候,考虑到加宽超过Boxing和Var-args,但是没有明确的解释.尝试搜索但没有得到任何更好的答案.
我得到的一个答案是因为编译器在选择较新的样式之前选择较旧的样式.但我不相信.
编辑:我知道扩大比拳击和var-args更喜欢.但为什么是我的问题.其中我知道一个.任何其他原因.