方法重载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)
,编译器会将错误列为不明确的方法 。 那么是因为Integer
和char[]
方法还是Integer
和Object
方法?
Java将总是尝试使用可用方法的最具体适用版本(请参阅JLS第15.12.2节 )。
Object
, char[]
和Integer
都可以取null
作为有效值。 因此,所有的3版本都适用,所以Java必须find最具体的一个。
由于Object
是char[]
的超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这就是为什么他们是模棱两可的。