次のコードを印刷「文字列」この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");
}
}
最初の例では、あいまいなエラーをせずにコンパイルすることができ、なぜ誰かが説明していただけますか?
「ヌル」は単なるパラメータです。 2番目のケースでは、 'Object'メソッドのシグネチャを他の2つのメソッドに対して解決することはできません。 –
おめでとう、私はあなたがJavaのタイプ理論の実際の穴の1つを見つけたと思います。一般に、「Null」は、システムを入力するための奇妙な生き物です。興味がある方は、いくつかの言語で使用されているOptionタイプをチェックしてみてください...私は個人的にはそれが本当に良い機能だと思っています。 –
http://stackoverflow.com/questions/2608394/how-is-ambiguity-in-selecting-from-overloaded-methods-resolved-in-javaまたはhttp://stackoverflow.com/questions/1545501/も参照してください。 which-overload-will-get-selected-for-null-in-java – Philipp