问题
我添加了三个带参数的方法:
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模糊方法.因此问题是因为Integer和char[]方法还是Integer和Object方法?
#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)这样的东西。