为什么表达`(真)? null:null`被视为char []

时间:2014-08-11 15:14:59

标签: java expression

System.out.println((true) ? null: null);

问题:

为什么我有

  

方法println(char [])对于PrintStream类型

是不明确的

以及未计算的原因,null以其他方式作为参数传递给println方法为什么表达式(true) ? null: null是视为char[]

编辑:IDE使用Eclipse。

5 个答案:

答案 0 :(得分:3)

您没有正确指定错误。

查看PrintStream.println()的重载。您会注意到唯一的引用类型是char[]StringObject

Netbeans给我错误

  

线程中的异常" main" java.lang.RuntimeException:无法编译的源代码 - 对println的引用不明确     println(char[])中的方法java.io.PrintStreamprintln(java.lang.String)中的方法java.io.PrintStream匹配

这正是我们预期的方式:它不能在它们之间做出选择,因为两者都同样有效。

它没有提到Object重载的原因可以在JLS第$15.12.2. Compile-Time Step 2: Determine Method Signature章的小图中找到:

  

例如,在已声明m(Object...)的类中声明m(Object)会导致某些调用表达式(例如m(Object))不再选择m(null),因为{ {1}}更具体。

您可以在第一阶段的说明中找到它。

答案 1 :(得分:1)

当一个方法重载了println(),println(char [] x),println(String x)等版本时,编译器无法决定选择哪种方法" null"作为输入。因此,它抛出一个编译时异常,说它不明确。

这里,给出表达"(真)? null:null"结果为" null"输出作为输入传递给println方法为" System.out.println(null)"这提到了例外。

答案 2 :(得分:0)

我认为这是Java方法调度的问题。

这个问题已经(有点)在这里被问到Java method dispatch with null argument

此处Method Overloading for null argument

我认为这是Oracle文档中的相关内容:

  

“可能有多个这样的方法,在这种情况下,选择最具体的方法。最具体方法的描述符(签名加返回类型)是在运行时用于执行方法调度的方法。” / p>

答案 3 :(得分:0)

我认为Sotirios是正确的,虽然我不确定它解释了为什么编译器调用调用模糊不清。

问题是System.outPrintStream,并且有多种方法接受引用类型,包括char[]Object和{{1} }。您对String类型的调用可以是其中任何一种。

我实际上从null得到了一个略有不同的错误,它指出了至少两个匹配的方法。

答案 4 :(得分:0)

println的可用重载版本如下:

public void println();

public void println(char x);

public void println(boolean x);

public void println(char[] x);

public void println(int x);

public void println(double x);

public void println(long x);

public void println(float x);

public void println(String X);

public void println(Object x) ;

编译器无法将此System.out.println(null);链接到任何上述重载版本,因为所有版本都对应于除了Ist之外的null。因此,恰好发生了类型PrintStream的模糊错误。