2016-03-23 10 views
10

次のコードを印刷「文字列」この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"); 
    } 

} 

最初の例では、あいまいなエラーをせずにコンパイルすることができ、なぜ誰かが説明していただけますか?

+3

「ヌル」は単なるパラメータです。 2番目のケースでは、 'Object'メソッドのシグネチャを他の2つのメソッドに対して解決することはできません。 –

+2

おめでとう、私はあなたがJavaのタイプ理論の実際の穴の1つを見つけたと思います。一般に、「Null」は、システムを入力するための奇妙な生き物です。興味がある方は、いくつかの言語で使用されているOptionタイプをチェックしてみてください...私は個人的にはそれが本当に良い機能だと思っています。 –

+5

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

答えて

0

てください、目的を呼び出すための解決方法のため、以下のJLS §15.12.2

が重要である 同じ型のデータ型がある場合に、

  1. (プリミティブデータ型用)の正確なデータを参照してくださいタイプマッチしてから呼び出してください。 1.1それ以外の場合は、このデータ型を使用して呼び出すことができます。
  2. 上記の場合失敗した場合は、データ型のラッパータイプまたはその親に一致します。
  3. 2より大きい場合は、このデータ型の値が一致しません。コンパイラは整数であり、最初の場合と同様に、コンパイラはそれを把握することができる場合、文字列を取り方法をとる方法の間に決めることができないようにコンパイルされない第2のケースで
関連する問題