为什么 'System.out.println(null);' 给出 “println(char[]) 方法对于 PrintStream 错误类型不明确”?

2022-09-01 23:04:56

我正在使用代码:

System.out.println(null);

它显示错误:

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

为什么不代表?nullObject


答案 1

有 3 种方法接受引用类型 - 、 、 。printlnPrintStreamprintln(char x[])println(String x)println(Object x)

当您通过时,所有3个都适用。方法重载规则更喜欢具有最具体参数类型的方法,因此未选择。nullprintln(Object x)

然后编译器不能在前两个 - & - 之间进行选择,因为它不是比更具体,反之亦然。println(char x[])println(String x)Stringchar[]

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

例如:

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

答案 2

如果调用,则有多个候选方法(带有 、 和 参数),编译器无法决定采用哪一个。System.println(null)char []StringObject

修复
将显式强制转换为 null。

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

或者使用空对象模式


为什么 null 不代表 Object?

来自 JLS 4.1 类型和值的种类

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

在实践中,程序员可以忽略 null 类型,而只是假装 null 只是一个特殊的文本,可以是任何引用类型

因此,的类型不是 ,尽管它可以转换为 (读作分配给) 一个 。nullObjectObject