如何为空参数做方法重载?

新手上路,请多包涵

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

 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 许可协议

阅读 407
2 个回答

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

Object , char[] and Integer can all take null as a valid value.因此所有 3 个版本都适用,因此 Java 必须找到最具体的一个。

由于 Objectchar[] 的超类型,数组版本比 Object 版本更具体。因此,如果仅存在这两种方法,则会选择 char[] 版本。

char[]Integer 版本都可用时,那么 它们 都比 Object 更具体,所以 Java 不能比另一个更具体决定调用哪一个。在这种情况下,您必须通过将参数转换为适当的类型来明确提及要调用的参数。

请注意,在实践中,这个问题的发生比人们想象的要少得多。这样做的原因是,它仅在您使用 null 或使用相当不特定类型的变量(例如 Object )显式调用方法时发生。

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

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

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

原文由 Joachim Sauer 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

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

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

原文由 jmg 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题