【发布时间】:2012-09-20 10:10:00
【问题描述】:
如果我错了,请纠正我。 Boxing+Varargs 是否优于 Boxing+Widening?
我在site 中发现它是另一种方式。
【问题讨论】:
标签: java overloading
如果我错了,请纠正我。 Boxing+Varargs 是否优于 Boxing+Widening?
我在site 中发现它是另一种方式。
【问题讨论】:
标签: java overloading
在JLS #15.2.2中定义了几个可以符合条件时调用什么方法:
第一阶段(第 15.12.2.2 节)执行重载决议,不允许装箱或拆箱转换,或使用变量 arity 方法调用。如果在此阶段没有找到适用的方法,则处理继续到第二阶段。
第二阶段(第 15.12.2.3 节)在允许装箱和拆箱的同时执行重载解决方案,但仍排除使用变量 arity 方法调用。如果在此阶段没有找到适用的方法,则处理继续到第三阶段。
第三阶段(第 15.12.2.4 节)允许将重载与可变参数方法、装箱和拆箱相结合。
总而言之:加宽 > 装箱和拆箱 > 可变参数
【讨论】:
Boxing + Widening 优于 Boxing + Varargs。我已经更改了@John 的示例以显示这一点:
public static void main(String[] args) {
int i = 2;
doX(i);
}
static void doX(Object i) {
System.out.println("Object");
}
static void doX(Integer... i) {
System.out.println("Integer...");
}
打印
Object
【讨论】:
Integer -> Object 不是根据this part of the specs 考虑加宽吗?
Boxing+Widening 优于 Boxing+Varargs。一个简单的测试就可以证实这一点。
public static void main(String[] args) {
int i = 2;
doX(2);
}
static void doX(Object i){
System.out.println("object...");
}
static void doX(Integer... i){
System.out.println("int...");
}
打印:
object...
编辑:对不起,我的错。我已经更正了代码。没注意到我输入了“对象...”
【讨论】: