为什么原始类型会先调用而不是包装类?

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调用test方法并传递整数参数时,它将调用接受原始类型作为参数的方法。 我只是想知道为什么它调用原始类型方法而不是接受包装类作为参数的方法? 是否有任何规则,java遵循调用方法?

谢谢,

作为一个粗略的“经验法则”,当在不同的重载之间进行选择时,Java对声明的参数表达式使用最接近的匹配方法。 在这种情况下,当方法被称为test(5)test(int i)test(Integer i)更接近,因为后者需要类型提升(自动装箱)来使实际的参数类型正确。

事实上,决策过程比这更复杂,但“经验法则”在大多数情况下都有效。

在这种情况下,您使用的是文字值5 ,它是Java中的原始int。 任何裸数字文字(例如Java中的文字都是原始文字)。 要调用另一个方法,需要传递new Integer(5) 。 Java 5中引入的自动装箱可以模糊两者之间的界限,但它们仍然彼此不同。

不是真正的答案,但是当重载时,无论调用哪种方法都无关紧要。 在这种情况下,如果值为Integer或int,则调用任一方法,结果应该相同。 重载仅应用于将值转换为其他forms,或作为提供默认值的机制。

String.valueOf()是将输入转换为String的一个很好的例子。

 a.test(5) // test(int i) 

编译器将其理解为原始类型。 如果你想运行你应该发送的其他方法

 a.test(new Integer(5)) // test(Integer i) 

因为Java选择最接近的匹配方法来运行

你已经将5作为原始类型传递,因此它将调用接受原语的方法,因此如果你想调用接受5作为对象的那个,那么你必须首先将它转换为对象,如下所示

 int a = 5; Integer b = new integer(5);