【发布时间】:2016-07-11 11:36:59
【问题描述】:
以下代码打印“字符串”
public class Riddle {
public static void main(String[] args) {
hello(null);
}
public static void hello(Object o) {
System.out.println("Object");
}
public static void hello(String s) {
System.out.println("String");
}
}
为什么该代码会编译? null 不是模棱两可吗?
例如,以下代码由于签名不明确而无法编译。
public class Riddle {
public static void main(String[] args) {
hello(null);
}
public static void hello(Object o) {
System.out.println("Object");
}
public static void hello(Integer o) {
System.out.println("Integer");
}
public static void hello(String s) {
System.out.println("String");
}
}
有人能解释一下为什么第一个示例可以编译而不会出现模棱两可的错误吗?
【问题讨论】:
-
null只是一个参数。在第二种情况下,Object方法签名无法针对其他两个进行解析。 -
恭喜,我认为您已经找到了 Java 类型理论中的实际漏洞之一。一般来说,“Null”对于类型系统来说是一种奇怪的生物。如果您对此感兴趣,可以查看某些语言使用的 Option 类型...我个人认为这是一个非常好的功能,希望将其引入 Java 还为时不晚。
标签: java