Следующий код печатает "String"Почему и как этот код Java компилируется?
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» - это просто параметр. Во втором случае подпись метода «Объект» не может быть разрешена в отношении двух других. –
Поздравляю, я думаю, вы нашли одну из реальных дыр в теории типов Java. В общем, «Null» - это нечто вроде странного существа, которое набирает системы. Если вы заинтересованы в этом, вы можете проверить тип Option, который используют некоторые языки ... Я лично считаю, что это действительно хорошая функция, и хотелось бы, чтобы не было слишком поздно переносить его на Java. –
См. Также http://stackoverflow.com/questions/2608394/how-is-ambiguity-in-selecting-from-overloaded-methods-resolved-in-java или также http://stackoverflow.com/questions/1545501/ которая-перегрузка будет-получить выбранный-для-нуль-в-Java – Philipp