Poniższe drukuje kod "String"Dlaczego i jak ten kod Java się kompiluje?
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");
}
}
Dlaczego ten kod skompilować? Czy nie jest niejednoznaczne?
Na przykład poniższy kod NIE zostanie skompilowany z powodu niejednoznacznego podpisu.
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");
}
}
Czy ktoś może wyjaśnić, dlaczego pierwszy przykład może się skompilować, nie powodując niejednoznacznych błędów?
Opcja 'null' jest tylko parametr. W drugim przypadku podpis metody "Object" nie może zostać rozwiązany względem dwóch pozostałych. –
Gratulacje, myślę, że znalazłeś jeden z faktycznych dziur w Teorii Typu Javy. Ogólnie rzecz biorąc, "Null" jest rodzajem dziwacznego stworzenia do systemów. Jeśli jesteś tym zainteresowany, możesz sprawdzić typ opcji używany w niektórych językach. Osobiście uważam, że jest to naprawdę dobra funkcja i chciałbym, żeby nie było za późno, aby wprowadzić ją do Javy. –
Zobacz także http://stackoverflow.com/questions/2608394/how-is-ambiguity-in-selecting-from-overloaded-methods-resolved-in-java lub też http://stackoverflow.com/questions/1545501/ which-overload-will-get-selected-for-null-in-java – Philipp