为什么 `System.out.println(null);` 会出现 "The method println(char[]) is ambiguous for the type PrintStream error" 错误?

23

我正在使用以下代码:

System.out.println(null);

它显示了错误:

The method println(char[]) is ambiguous for the type PrintStream

为什么 null 不代表 Object


2
System.out.println((Object)null); - Yassin Hajaj
1
请参见https://dev59.com/kWcs5IYBdhLWcg3wOBXl。 - Raedwald
2个回答

27

PrintStream中有3种接受引用类型的println方法 - println(char x[]), println(String x), println(Object x)

当您传递null时,所有3种方法都适用。方法重载规则更喜欢具有最具体参数类型的方法,因此不会选择println(Object x)

然后编译器无法在前两个方法println(char x[])println(String x)之间进行选择,因为String不比char[]更具体,反之亦然。

如果要选择特定的方法,请将null强制转换为所需的类型。

例如:

System.out.println((String)null);

1
我知道并理解这个概念。但为了回答更完整,JLS是否在某处指定了为什么例如char[]String是同样具体的?毕竟,char是一个原始类型而String是一个对象。 - Magnilex
12
char是原始数据类型,而char[]是对象。char[]不是String的子类,String也不是char[]的子类,因此两者都不比另一个更具体。 - Eran
4
请注意,可以将char x[]写为char[] x - 许多人(例如谷歌的样式指南)更喜欢后者形式,因为x的类型是char []而不是char。将类型放在一起使阅读更容易。 - Andy Turner

8

如果你调用System.println(null),会有多个备选方法(带有char [], StringObject参数),编译器无法决定使用哪一个。

解决方法
在null值前添加明确的强制类型转换。

System.out.println((Object)null);

或者使用空对象模式


为什么null不表示Object?

来自JLS 4.1类型和值的种类

还有一种特殊的空类型,即表达式null的类型, 它没有名称。
由于空类型没有名称,因此无法声明空类型的变量或将其转换为null类型。
null引用是null类型表达式的唯一可能值。null引用始终可以转换为任何引用类型。
null引用始终可以分配或强制转换为任何引用类型。

实际上,程序员可以忽略空类型,只需假装null仅仅是一个可以是任何引用类型的特殊字面量

因此,null的类型不是Object,尽管它可以被转换(读作分配)为Object


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接