2016-08-28 19 views
0

どのオーバーロードされたメソッドが以下のメソッドに対して呼び出され、なぜ曖昧なオーバーロードされたメソッドにnullを渡す

私はこのコードを実行し、Listでオーバーロードされたメソッドを呼び出しますが、はなぜ発生しますか?

public class AmbigiousOverload { 

    public static void add(Object o) { 
     System.out.println("Overloaded method with Object."); 
    } 

    public static void add(List l) { 
     System.out.println("Overloaded method with List."); 
    } 

    public static void main(String[] args) { 
     add(null); 
    } 

} 

出力:すべてのList実装がObjectのサブクラスであるとしてList過負荷が、最も具体的なマッチングの過負荷であるため、Overloaded method with List.

+0

"どのオーバーロードされたメソッドが呼び出されますか"あなたはどちらを知っていますか?あなたの質問にあります。 –

答えて

1

Listオーバーロードが呼び出されます。

JLS Sec 15.12.2.5

から:

非公式直感、第1の方法で扱う任意の呼び出しがコンパイル時エラーなしで他方に渡すことができる場合は、1つの方法は、別のより特異的であることです。

あなたはadd(List)に渡すことができます任意のパラメータもadd(List)がより具体的で、add(Object)に渡すことができますので。したがって、nullを両方に渡すことができれば、より具体的な方法が選択されます。

ListStringが「等しく」特定されているため、add(String)のオーバーロードがあった場合はコンパイルされないことに注意してください。 (または他のクラス:Stringである必要はありません)。

+0

'List'は' Object'に固有のものと考えられますか? 'List'はインターフェースであり、クラスではありません。 –

+0

すべての 'List'実装は' Object'です。 –

関連する問題