【问题标题】:why primitive type will call first rather than wrapper classes?为什么原始类型会首先调用而不是包装类?
【发布时间】:2011-05-30 06:33:31
【问题描述】:
public class A {
public void test(Integer i) {
System.out.println("In Wrapper Method");
}
public void test(int i) {
System.out.println("In primitive Method");
}
public static void main(String args[]) {
A a = new A();
a.test(5);
}
}
当我从 main 调用测试方法并传递整数参数时,它将调用接受原始类型作为参数的方法。我只想知道为什么它调用原始类型方法而不是接受包装类作为参数的方法? java调用方法有什么规则吗?
谢谢,
【问题讨论】:
标签:
java
class
wrapper
primitive-types
【解决方案1】:
作为一个粗略的“经验法则”,Java 在不同的重载之间进行选择时,对参数表达式的声明类型使用最接近的匹配方法。在这种情况下,当方法被称为test(5) 时,test(int i) 比 test(Integer i) 更接近,因为后者需要类型提升(自动装箱)以使实际参数类型正确。
事实上,决策过程比这复杂得多,但“经验法则”在大多数情况下都有效。
【解决方案2】:
在这种情况下,您使用的是字面值 5,它是 Java 中的原始 int。任何裸数字字面量(例如 Java 中的字面量)都是原语。要调用其他方法,则需要传递 new Integer(5)。 Java 5 中引入的自动装箱可以模糊两者之间的界限,但它们仍然彼此不同。
【解决方案3】:
不是一个真正的答案,但是在重载时调用哪个方法并不重要。在这种情况下,如果值为 Integer 或 int,则调用任一方法,结果应该相同。重载只能用于将值转换为其他形式,或作为提供默认值的机制。
String.valueOf() 是将输入转换为字符串的一个很好的例子。
【解决方案4】:
a.test(5) // test(int i)
编译器将其理解为原始类型。如果你想运行其他方法,你应该发送
a.test(new Integer(5)) // test(Integer i)
因为Java选择最接近的匹配方法运行
【解决方案5】:
您已将 5 作为原始类型传递,因此它将调用接受原始类型的方法,因此如果您想调用接受 5 作为对象的方法,则必须首先将其转换为对象,如下所示
int a = 5;
Integer b = new integer(5);