方法重载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)时,编译器抛出错误as模糊方法.因此问题是因为Integerchar[]方法还是IntegerObject方法?


#1 热门回答(178 赞)

Java将始终尝试使用可用方法的最具体适用版本(参见JLS §15.12.2)。

Object,char[]Integer可以将null作为有效值。因此,所有3个版本都适用,因此Java必须找到最具体的版本。

由于Object是超级型号char[],因此阵列版本比Object版本更具体。因此,如果仅存在这两种方法,则将选择char[]版本。

char[]Integerversions都可用时,那么它们中的都比Object更具体,但没有一个比另一个更具体,因此Java无法决定调用哪一个。在这种情况下,你必须通过将参数强制转换为适当的类型来明确提及要调用的那个。

请注意,在实践中,这个问题比人们想象的要少得多。这样做的原因是它只会在你使用一个非常特定类型的变量(例如311117911)显式调用带有null的方法时才会发生。

相反,以下调用将是完全明确的:

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

虽然你仍在传递值null,但Java确切地知道要调用哪个方法,因为它会考虑变量的类型。


#2 热门回答(36 赞)

当用anull参数调用时,这三种方法中的每一对本身都是模糊的。因为每个参数类型都是引用类型。

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

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

如果你真的计划使用null参数调用这些方法,我建议你删除这种歧义。这样的设计将来会产生错误。


#3 热门回答(4 赞)

null是三种类型中任何一种的有效值;所以编译器无法决定使用哪个函数。使用像doSomething((Object)null)doSomething((Integer)null)这样的东西。