我添加了三个带参数的方法:
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 必须找到最具体的一个。
由于 Object
是 char[]
的父类(super class)型,因此数组版本比 Object
版本更具体。因此,如果仅存在这两种方法,则将选择 char[]
版本。
当char[]
和Integer
版本都可用时,两者都比Object
更具体code> 但没有一个比另一个更具体,因此 Java 无法决定调用哪一个。在这种情况下,您必须通过将参数转换为适当的类型来明确提及要调用哪一个。
请注意,实际上这个问题发生的几率比人们想象的要少得多。原因是,只有当您使用 null
或使用相当不特定类型的变量(例如 Object
)显式调用方法时,才会发生这种情况。
相反,以下调用将是完全明确的:
char[] x = null;
doSomething(x);
虽然您仍然传递值 null
,但 Java 确切地知道要调用哪个方法,因为它会考虑变量的类型。
关于java - 如何对空参数进行方法重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19455689/