问题是方法重载:String.valueOf
Java规范语言要求在这些情况下,选择最具体的重载:
如果多个成员方法既可访问又适用于方法调用,则需要选择一个成员方法来为运行时方法调度提供描述符。Java 编程语言使用选择最具体方法的规则。
A 是 an,但不是所有的 is-a 。因此, 比 更具体,并且根据 Java 语言的指定,在这种情况下选择重载。char[]
Object
Object
char[]
char[]
Object
String.valueOf(char[])
String.valueOf(char[])
期望数组是 non-,并且由于在本例中给出了,因此它抛出 。null
null
NullPointerException
简单的“修复”是显式地将 转换为 如下所示:null
Object
System.out.println(String.valueOf((Object) null));
// prints "null"
相关问题
故事的寓意
有几个重要的:
-
有效的 Java 第 2 版,第 41 项:明智地使用重载
- 仅仅因为你可以超载,并不意味着你应该每次都超载
- 它们会引起混淆(特别是如果方法做着截然不同的事情)
- 使用良好的IDE,您可以在编译时检查选择了哪个重载
- 使用Eclipse,您可以将鼠标悬停在上面的表达式上,然后看到确实选择了重载!
valueOf(char[])
- 有时您希望显式投射(要遵循的示例)
null
另请参见
关于铸造null
至少在两种情况下,需要显式转换为特定的引用类型:null
- 选择重载(如上例所示)
- 将单个参数提供给 vararg 参数
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"
另请参见
相关问题