1

如果还存在而不是生成模棱两可的方法错误,method(char[] a)为什么还要执行 Java ?method(null)method(Object a)


当尝试使用静态方法构建字符串时String.valueOf()......我面临这种情况。请参阅下面的不言自明的准备运行示例:

public class NotSoClearNullPointerException {

  public static void main(String[] args) {

    NotSoClearNullPointerException instance = new NotSoClearNullPointerException ();
    instance.algo(null);
    String str =  String.valueOf(instance.getANull());
    System.out.println ("This actually is beign send to stdout : " + str);
    str =  String.valueOf(null);
    System.out.println ("We never gonna make it to stdout!! : " + str);


  }

  public Object getANull() {
    return null; // the hardest method i ever wrote... xD
  }

}

在检查了String 类的源代码后,我看到 String.valueOf(Object) 方法是空安全的!!,所以String.valueOf(null)实际上并没有调用该String.valueOf(Object)方法,而是调用另一个重载方法。我猜是调用String.valueOf(char[]),知道每个数组(尽管有base type)都是一个对象。

我很确定这一点,因为我进行了自己的测试,再次准备好运行以下代码:

public class ArgumentDispatchExample {

  public static void main(String[] args) {

    ArgumentDispatchExample instance = new ArgumentDispatchExample ();
    instance.method(null);
  }

  public void method (Object a) {
    System.out.println("Object");
  }


  public void method (char[] a) {
    System.out.println("char[]");
  }

}

假设我是对的......(顺便说一句,这是问题的一部分......),我一直认为这个调用必须产生一个模棱两可的错误,因为如果编译器必须将“null”关联到一个对象或 char[] 实例。

Java 不支持双重分派(即解析调用什么方法来检查参数的实际类型),那么这里使用什么样的规则来决定将 null 作为 char[] 呢?在我的一生中,我认为 null 更接近于对象“事物”,而不是其他类型的抽象。

“更多”将空值关联到哪种类型?

我急切地等待答案!!

问候。

胜利者

PD:作为HPO(谦虚的个人观点)......我们不同意这有点令人困惑,特别是如果你看第一个例子......?也许,这是在 Java 社区中进行辩论的一个很好的起点。非常感谢!。

4

0 回答 0