2

我想知道为什么下面的代码不起作用:

System.out.print(null);    
response.getWriter().print(null);

但下面的工作:

String s = null;
System.out.print(s);
response.getWriter().print(s);

null传递 a与传递引用 as 相比有什么区别null

已编辑: 前面提到的不起作用表示编译错误。

4

3 回答 3

9

这是因为您可以传递 aObject或 a String。由于null两者都适合,编译器不知道使用哪种方法,导致编译错误。

方法定义:

相反,如果您提供一个Object或一个String变量(即使它有null值),编译器就会知道使用哪种方法。

编辑:这在这个答案中得到了更好的解释。至于指向 Java 规范的内部链接,你可以在这里阅读,这种情况适合这里:

非正式的直觉是一个方法比另一个方法更具体**如果第一个方法处理的任何调用可以传递给另一个方法而不会出现编译时类型错误。

可能没有一种方法是最具体的,因为有两种或多种方法是最具体的。

于 2013-02-09T03:43:06.880 回答
3

这是因为System.out.println()期望某种类型的东西。null没有类型,因此不能单独输出。这通过以下方式显示:

不起作用:

 System.out.println(null);

作品:

 System.out.println((String)null);
 System.out.println((char[])null);
 System.out.println((Object)null);

这是编译器类型检查方法调用的参数。

于 2013-02-09T03:59:56.787 回答
2

谢谢大家的答案 。根据您的意见,我自己编写了答案。似乎这个调用System.out.print(null)对编译器来说是模棱两可的,因为print(null)这里会找到两个最佳的特定匹配,即print(String)print(char[])。所以编译器无法确定在这里调用哪个方法。
小例子是:

private void methodCall(String str) {
}

private void methodCall(char[] ch){
}

现在这段代码变得模棱两可:methodCall(null)

于 2013-02-09T07:46:28.850 回答