2015-05-08 21 views
6

Ich habe den folgenden CodeNullwert in Methodenparameter

import java.util.List; 

public class Sample { 

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

    static void test(List<Object> a){ 
     System.out.println("List of Object"); 
    } 
    static void test(Object a){ 
     System.out.println("Object"); 
    } 
} 

und ich habe folgende Ausgabe in der Konsole

List of Object 

Warum funktioniert dieser Aufruf test(Object a)? Können Sie erklären, wie es "Liste als" null dauerte?

+2

Zugehörig: [Überladene Methodenauswahl basierend auf dem realen Typ des Parameters] (http://stackoverflow.com/q/1572322/1065197), [Überladen der Methode und Auswählen des spezifischsten Typs] (http://stackoverflow.com/q/9361639/1065197). –

Antwort

7

Kurz gesagt, die spezifischste Methode unter den Überladungen ist gewählt.

In diesem Fall ist die spezifischste Methode die List<Object>, da es sich um einen Subtyp von Object handelt.

Der genaue Algorithmus, den Java verwendet, um überladene Methoden auszuwählen, ist ziemlich komplex. Details finden Sie unter Java Language Specification section 15.12.2.5.

4

Immer spezifisch zuerst, in solchen Fällen. Wenn Sie List in String ändern, wird dasselbe gedruckt. Jede Klasse ist Kind des Objekts, also wenn es überladen werden muss, wird es zu der spezifischeren Klasse.