为什么`System.out.println(null);`give"方法println(char [])对于类型PrintStream错误是不明确的"?

Kan*_*rai 20 java null system println system.out

我正在使用代码:

System.out.println(null);
Run Code Online (Sandbox Code Playgroud)

它显示错误:

The method println(char[]) is ambiguous for the type PrintStream
Run Code Online (Sandbox Code Playgroud)

为什么没有null代表Object

Era*_*ran 25

有3种println方法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);
Run Code Online (Sandbox Code Playgroud)

  • @Magnilex char是一个原语,但char []是一个对象.char []不是String的子类,String不是char []的子类.因此,两者中没有一个更具体. (11认同)
  • @KannanThangadurai注意你可以把`char x []`写成`char [] x` - 很多(例如[Google的风格指南](https://google.github.io/styleguide/javaguide.html#s4.8.3. 2-array-declarations))更喜欢后一种形式,因为`x`的类型是`char []`,而不是`char`.将类型保持在一起使其更易于阅读. (3认同)

Gya*_*ain 7

如果你打电话System.println(null)有多个候选方法(用char [],StringObject参数),编译器不能决定采取哪一个.

修复
将显式强制转换添加到null.

System.out.println((Object)null);
Run Code Online (Sandbox Code Playgroud)

或者使用null对象模式.


为什么null不代表对象?

JLS 4.1类型和价值的种类

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

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

这样的类型null Object,虽然它可被转化为(读-为分配给)一个Object.