我正在为SCJP考试做准备,在学习加宽部分时,我发现加宽在重载方面优于Boxing和Var-args,但没有明确的解释。我试过搜索,但没有得到更好的答案。
我得到的一个答案是,编译器在选择较新的样式之前会先选择较旧的样式。但我并不信服。
编辑:我知道加宽比装箱和var-args更可取。但我的问题是为什么。我只知道其中一个。任何其他原因。
发布于 2010-01-25 01:50:55
是的,由于兼容性要求,编译器“选择旧的样式而不是新的样式”。想象一下,在Java5出现之前编写的一些代码,当在Java5下编译时,行为突然发生了变化!那就太糟糕了。
自Java诞生以来,不断扩大的转换就已经存在,但自动装箱和varargs是Java5的新特性。
发布于 2010-01-25 01:53:31
下面是它的一个例子:
class Widen {
private static void widen(long k) {
System.out.println("Converted to long: " + k);
}
private static void widen(int ... k) {
System.out.println("Converted to varargs: " + k);
}
private static void widen(Integer k) {
System.out.println("Converted to Integer: " + k);
}
public static void main(String ... args) {
int value = 3;
widen(value); // Output: Converted to long: 3
}
} 因此,这意味着在自动装箱和使用varargs之前,它将会变宽。如果我们使用带有long参数的widen方法,它将在varargs之前选择自动装箱。
发布于 2010-01-25 02:01:10
编译器必须保持与以前版本的Java的兼容性。最重要的是,编译器选择对参数进行最高性能/最小程度的更改。升级到另一个原语比创建包装器对象更好,在内存使用和性能方面也比创建数组更好。
https://stackoverflow.com/questions/2128034
复制相似问题