java - 如何对空参数进行方法重载?

标签 java oop null overloading

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

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 方法?

最佳答案

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

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

由于 Objectchar[] 的父类(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/

相关文章:

java - 重写父类(super class)的方法。不明确的引用编译时错误

c++ - 派生类和单例

javascript - 如何共享作为对象属性的函数并避免重复代码

java - java中的多线程客户端服务器聊天应用程序

java - apache Spark - 迭代地跳过并从 RDD 中获取

java - JSplitPane 仅滑动到一侧

java - Object[] 数组可以容纳什么?

postgresql - 在postgres中更新具有空值的整数列

reflection - 在不使用反射的情况下检查 Go 中的接口(interface)值是否为 nil

php - 仅当两个字段同时为空时,Mysql 才更新字段