我正在使用以下代码:
System.out.println(null);
它显示了错误:
The method println(char[]) is ambiguous for the type PrintStream
为什么 null
不代表 Object
?
我正在使用以下代码:
System.out.println(null);
它显示了错误:
The method println(char[]) is ambiguous for the type PrintStream
为什么 null
不代表 Object
?
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);
char[]
和String
是同样具体的?毕竟,char
是一个原始类型而String
是一个对象。 - Magnilexchar x[]
写为char[] x
- 许多人(例如谷歌的样式指南)更喜欢后者形式,因为x
的类型是char []
而不是char
。将类型放在一起使阅读更容易。 - Andy Turner如果你调用System.println(null)
,会有多个备选方法(带有char []
, String
和 Object
参数),编译器无法决定使用哪一个。
解决方法
在null值前添加明确的强制类型转换。
System.out.println((Object)null);
或者使用空对象模式。
为什么null不表示Object?
还有一种特殊的空类型,即表达式null的类型, 它没有名称。
由于空类型没有名称,因此无法声明空类型的变量或将其转换为null类型。
null引用是null类型表达式的唯一可能值。null引用始终可以转换为任何引用类型。
null引用始终可以分配或强制转换为任何引用类型。
实际上,程序员可以忽略空类型,只需假装null仅仅是一个可以是任何引用类型的特殊字面量
因此,null
的类型不是Object
,尽管它可以被转换(读作分配)为Object
。
System.out.println((Object)null);
- Yassin Hajaj