如何为空参数进行方法重载?

我添加了三个带参数的方法:

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)时,编译器抛出的错误为 模棱两可的方法。那么问题是因为 Integerchar[]方法还是 IntegerObject方法?

94890 次浏览

null是三种类型中任何一种的有效值; 因此编译器无法决定使用哪个函数。使用类似于 doSomething((Object)null)doSomething((Integer)null)的代替。

当使用 null参数调用这三个方法中的每一对时,它们本身都是不明确的。因为每个参数类型都是引用类型。

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

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

如果您实际上计划使用 null参数调用这些方法,我建议您消除这种模糊性。这样的设计会在未来引起错误。

Java 中的每个类都扩展了 Object 类。甚至 Integer 类也扩展 Object。因此 Object 和 Integer 都被视为 Object 实例。因此,当您将 null 作为参数传递给编译器时,会混淆要调用哪个对象方法,即使用 Object 参数或 Integer 参数,因为它们都是对象,并且它们的引用可以为 null。但是 Java 中的原语并不扩展 Object。

Java 总是尝试使用可用方法的最具体的适用版本(参见 JLS 15.12.2)。

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

因为 Objectchar[]的超级类型,所以数组版本比 Object版本更具体。因此,如果只有这两个方法存在,将选择 char[]版本。

char[]Integer版本都可用时,它们的 都有Object更具体,但没有一个比另一个更具体,因此 Java 无法决定调用哪一个。在这种情况下,您必须通过将参数转换为适当的类型来显式地提及要调用的参数。

请注意,在实践中,这个问题远比人们想象的更少发生。这样做的原因是,只有在使用 null或非特定类型(如 Object)的变量显式调用方法时才会发生这种情况。

相反,以下援引将是完全明确的:

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

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

我已经试过了,当有一对重载的方法,其中一个有一个参数类型 Object,然后编译器将总是选择具有更具体的类型的方法。但是,当有多个特定类型时,编译器将抛出一个不明确的方法错误。

由于这是一个编译时事件,因此只有在有意向此方法传递 null 时才会发生这种情况。如果这是有意为之,那么最好再次重载这个方法,不要使用任何参数,或者完全创建另一个方法。

由于 doSomething(char[] obj)doSomething(Integer obj)的原因,存在歧义。

Char []和 Integer 都是 null 的上级,这就是为什么它们是模糊的。

class Sample{
public static void main (String[] args) {
Sample s = new Sample();
s.printVal(null);


}
public static void printVal(Object i){
System.out.println("obj called "+i);
}


public static void printVal(Integer i){
System.out.println("Int called "+i);
}
}

输出是 Int,称为 null,因此 char []和 Integer 是模糊的