如果还存在而不是生成模棱两可的方法错误,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 社区中进行辩论的一个很好的起点。非常感谢!。