我正在使用代码:
System.out.println(null);
显示错误:
The method println(char[]) is ambiguous for the type PrintStream
为什么null
不代表Object
?
答案 0 :(得分:25)
println
中有3个PrintStream
方法接受引用类型 - 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 :(得分:7)
如果你调用System.println(null)
,有多个候选方法(char []
,String
和Object
参数),编译器无法决定采用哪种方法。< / p>
修复
将显式转换添加到null。
System.out.println((Object)null);
为什么
null
代表对象?
来自JLS 4.1 The Kinds of Types and Values
还有一个特殊的null类型,表达式的类型为null, 没有名字。
因为null类型没有名字,所以不可能 声明null类型的变量或转换为null类型 空引用是null表达式的唯一可能值 类型。空引用始终可以转换为任何引用类型。
空引用始终可以分配或转换为任何引用类型
In 实践中,程序员可以忽略null类型而只是假装 null只是一个特殊的文字,可以是任何参考 输入
所以null
的类型不是 Object
,但可以将其转换为(读作分配给)Object
。