我想知道为什么以下代码不起作用:
System.out.print(null);
response.getWriter().print(null);
但是下面的工作:
String s = null;
System.out.print(s);
response.getWriter().print(s);
传递null
与传递引用为null
之间的区别是什么?
已编辑:前面提到的不起作用表示编译错误。
答案 0 :(得分:9)
这是因为您可以传递Object
或String
。由于null
可以兼容,因此编译器不知道使用哪种方法,导致编译错误。
方法定义:
相反,如果您提供Object
或String
变量(即使它具有null
值),编译器将知道要使用哪种方法。
编辑:这是更好的解释in this answer。至于指向Java规范的内部链接,你可以读它here,这种情况适合这里:
非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时类型错误的调用,那么一个方法比另一个方法更具体。
可能没有最具体的方法,因为有两种或更多种方法是最具体的。
答案 1 :(得分:3)
这是因为System.out.println()
期望某种类型的东西。 null
没有类型,因此无法自行输出。这显示如下:
不起作用:
System.out.println(null);
使用:
System.out.println((String)null);
System.out.println((char[])null);
System.out.println((Object)null);
这是编译器类型检查方法调用的参数。
答案 2 :(得分:2)
谢谢大家的回答。根据您的意见,我自己编写了答案。似乎调用System.out.print(null)
对编译器来说是不明确的,因为print(null)
这里将找到两个最佳的特定匹配,即print(String)
和print(char[])
。所以编译器无法确定在这里调用哪种方法
小例子是:
private void methodCall(String str) {
}
private void methodCall(char[] ch){
}
现在这段代码变得暧昧:methodCall(null)
。