方法重载null参数

我已经添加了三个参数的方法:

public static void doSomething(Object obj) { System.out.println("Object called"); } public static void doSomething(char[] obj) { System.out.println("Array called"); } public static void doSomething(Integer obj) { System.out.println("Integer called"); } 

当我调用doSomething(null) ,编译器会将错误列为不明确的方法 。 那么是因为Integerchar[]方法还是IntegerObject方法?

Java将总是尝试使用可用方法的最具体适用版本(请参阅JLS第15.12.2节 )。

Objectchar[]Integer都可以取null作为有效值。 因此,所有的3版本都适用,所以Java必须find最具体的一个。

由于Objectchar[]的超types,因此数组版本比Object -version更具体。 所以如果只有这两个方法存在,将会selectchar[]版本。

char[]Integer版本都可用时,它们都比Object更具体,但没有一个比另一个更具体,所以Java不能决定要调用哪一个。 在这种情况下,您必须通过将参数转换为适当的types来明确地提及要调用哪一个。

请注意,实际上这个问题比人们想象的要less得多。 这样做的原因是只有当你使用null或者一个非特定types的variables(如Object )显式调用一个方法时才会发生这种情况。

相反,下面的调用是完全不含糊的:

 char[] x = null; doSomething(x); 

虽然您仍然将值传递给null ,但Java确切知道要调用哪个方法,因为它会考虑variables的types。

当用一个null参数调用时,这三种方法中的每一种都是不明确的。 因为每个参数types都是引用types。

以下是用null调用你的一个特定方法的三种方法。

 doSomething( (Object) null); doSomething( (Integer) null); doSomething( (char[]) null); 

我可以build议消除这种歧义,如果你真的打算用null参数调用这些方法。 这样的devise在未来会引起错误。

null是三种types中任何一种的有效值; 所以编译器不能决定使用哪个函数。 改用doSomething((Object)null)doSomething((Integer)null)

Java中的每个类扩展了Object类.Even Integer类也扩展了Object。 因此Object和Integer都被视为Object实例。 所以当你传递null作为一个参数比编译器会弄糊涂哪个对象的方法来调用ie与参数对象或参数整数,因为他们都是对象和它们的引用可以为空。 但是java中的原语并没有扩展Object。

我已经尝试了这一点,当有一对重载的方法,其中一个有一个参数types对象,那么编译器将始终select更具体的types的方法。 但是当有多个特定的types时,编译器会抛出一个不明确的方法错误。

由于这是编译时事件,所以只有在有意将null传递给此方法时才会发生。 如果这样做是故意的,那么最好再次用不带参数的方法重载这个方法,或者完全创build另一个方法。

由于doSomething(char [] obj)和doSomething(Integer obj)存在歧义。

char []和Integer都是相同的优于null这就是为什么他们是模棱两可的。