优先原则:加宽优先于装箱优先于var-arg(加宽->装箱->var-arg)
加宽一个基本变量是合法的,在每一种情况下,当未找到精确的匹配时,JVM就会使用一个方法,他带有比形参更宽的最小实参。
Java5的设计者决定:最重要的规则应该是已有的代码应该像他们过去那样运行。Java 5's designers decided that the most important rule should be that pre-existing code should function the way it used to。即使每个调用都需要某种转换,编译器仍将优先选择较旧的风格,从而保持现有代码的健壮性。var-arg方法比其他方法“更宽松”。
加宽引用变量:
这里的关键点是:引用变量加宽依赖于继承。换句话说,依赖于IS-A测试。因此,从一个包装器类加宽到另一个包装器类是非法的。因为包装器类之间是平等的。例如,Short IS-A Integer这种说法是无效的。(The key point here is that reference widening depends on inheritance, in other words the IS-A test. Because of this, it's not legal to widen from one wrapper class to another, because the wrapper classes are peers to one another. For instance, it's NOT valid to say that Short IS-A Integer.)eg:Byte不能加宽到Short或Integer。
在一个方法匹配方案中吧加宽、装箱、var-arg结合的情况:
class Vararg {
}
结果:
long...
Integer...
使用加宽、装箱、var-arg的重载方法的几条规则:
- 基本加宽使用可能“最小的”方法参数。Primitive widening uses the "smallest" method argument possible.
- 不能从一种包装器类型加宽的另一种包装器类型.You CANNOT widen from one wrapper type to another. (IS-A fails.)
- 可以先装箱,后加宽(int可以通过Integer变成Object)You can box and then widen. (An int can become an Object, via Integer.)。
- 不能先加宽,后装箱(int不能变成Long)。You CANNOT widen and then box. (An int can't become a Long.)。原因:
- 可以结合使用装箱、var-arg、加宽。
分析以下代码的输出结果:package com.baidu;
public class Demo1 {