空参数的方法重载

2022-08-31 07:36:03

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

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


答案 1

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

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

因为 是 的超类型,数组版本比 -版本更具体。因此,如果仅存在这两种方法,则将选择版本。Objectchar[]Objectchar[]

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

请注意,在实践中,这个问题的发生比人们想象的要少得多。这样做的原因是,仅当您显式调用具有或具有相当非特定类型的变量(例如 )的方法时,才会发生这种情况。nullObject

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

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

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


答案 2

当使用参数调用这三种方法的每对时,其本身都是模棱两可的。因为每个参数类型都是一个引用类型。null

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

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

如果您实际上计划使用参数调用这些方法,我是否可以建议消除这种歧义。这样的设计会在未来招致错误。null