我添加了三个带参数的方法:
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)
时,编译器将错误作为 不明确的方法 抛出。问题是 Object
Integer
char[]
Integer
原文由 Phani 发布,翻译遵循 CC BY-SA 4.0 许可协议
Java 将始终尝试使用可用方法的最具体适用版本(请参阅 JLS §15.12.2 )。
Object
,char[]
andInteger
can all takenull
as a valid value.因此所有 3 个版本都适用,因此 Java 必须找到最具体的一个。由于
Object
是char[]
的超类型,数组版本比Object
版本更具体。因此,如果仅存在这两种方法,则会选择char[]
版本。当
char[]
和Integer
版本都可用时,那么 它们 都比Object
更具体,所以 Java 不能比另一个更具体决定调用哪一个。在这种情况下,您必须通过将参数转换为适当的类型来明确提及要调用的参数。请注意,在实践中,这个问题的发生比人们想象的要少得多。这样做的原因是,它仅在您使用
null
或使用相当不特定类型的变量(例如Object
)显式调用方法时发生。相反,以下调用将是完全明确的:
尽管您仍在传递值
null
,但 Java 确切地知道要调用哪个方法,因为它会考虑变量的类型。