问题是String.valueOf方法已重载:
String.valueOf(Object)
String.valueOf(char[])
Java规范语言要求在这种情况下,选择最具体的重载:
JLS 15.12.2.5选择最具体的方法
如果多个成员方法既可访问又可应用于方法调用,则必须选择一个成员方法来为运行时方法分派提供描述符。Java编程语言使用选择最具体方法的规则。
一个char[] 是- Object但不是全部Object 是-一个 char[]。因此,char[]它比特定于Object,并且按照Java语言的规定,String.valueOf(char[])在这种情况下选择重载。
String.valueOf(char[])期望数组为非数组null,并且由于null在这种情况下给出了数组,因此它抛出NullPointerException。
简单的“修复”方法是将null显式转换Object为如下所示:
System.out.println(String.valueOf((Object) null));
// prints "null"
相关问题
多态多义性如何区分?
Java中将为空选择哪个重载?
故事的道德启示
有几个重要的方面:
有效的Java 2nd Edition,项目41:明智地使用重载
仅仅因为您可以超载,并不意味着您每次都应该
它们可能引起混乱(尤其是如果方法做的事情截然不同的话)
使用良好的IDE,您可以检查在编译时选择了哪个重载
使用Eclipse,您可以将鼠标悬停在上面的表达式上,并看到确实valueOf(char[])选择了重载!
有时您想显式投射null(以下示例)
也可以看看
多态性vs覆盖vs重载
方法重载。你可以过度使用它吗?
铸造时 null
至少有两种情况需要显式转换null为特定引用类型:
选择重载(如上例所示)
为了给null作为单个参数的可变参数参数
后者的一个简单示例如下:
static void vararg(Object... os) {
System.out.println(os.length);
}
然后,我们可以得到以下内容:
vararg(null, null, null); // prints "3"
vararg(null, null); // prints "2"
vararg(null); // throws NullPointerException!
vararg((Object) null); // prints "1"