System.out.println((true) ? null: null);
问题:
为什么我有
方法println(char [])对于PrintStream类型
是不明确的
以及未计算的原因,null
以其他方式作为参数传递给println
方法或,为什么表达式(true) ? null: null
是视为char[]
。
编辑:IDE使用Eclipse。
答案 0 :(得分:3)
您没有正确指定错误。
查看PrintStream.println()
的重载。您会注意到唯一的引用类型是char[]
,String
和Object
。
Netbeans给我错误
线程中的异常" main"
java.lang.RuntimeException
:无法编译的源代码 - 对println
的引用不明确println(char[])
中的方法java.io.PrintStream
和println(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.out
是PrintStream
,并且有多种方法接受引用类型,包括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的模糊错误。