2015-08-11 11 views
6

Znalazłem ten kod Java z this site. Nie rozumiem, w jaki sposób kompiluje się bez niejednoznacznego błędu.Dlaczego można przekazać wartość zerową do przeciążonej metody Java?

package swain.test; 

public class Test { 
    public static void JavaTest(Object obj) { 
     System.out.println("Object"); 
    } 

    public static void JavaTest(String arg) { 
     System.out.println("String"); 
    } 

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

wyjściowa:

String 
+1

Co jest nie tak z powyższym kodem? –

+1

dlaczego nie powinien on się kompilować? Twoja odpowiedź nawet nie zapytała, dlaczego to String, a nie obiekt, który jest drukowany na ekranie, więc zakładam, że mówisz tylko o kompilacji. nie ma żadnego problemu – 12dollar

+0

Prawdopodobnie dlatego, że 'String' IS-A' Object'. – kajacx

Odpowiedz

6

null mogą być przekazywane zarówno JavaTest(String arg) i JavaTest(Object obj), więc kompilator wybiera metodę z bardziej specyficznych typów argumentów. Ponieważ String jest bardziej specyficzny niż Object (String będący podklasą Object), wybrano JavaTest(String arg).

Jeśli zamiast JavaTest(Object obj) miałeś JavaTest(Integer obj), kompilacja nie doszłoby do skutku, ponieważ Integer nie jest bardziej szczegółowy niż String i String is not more specific than Integer`, więc kompilator nie będzie mógł dokonać wyboru.

+1

Ale 'Integer' również dopuszcza' Null' nawet wtedy to się nie powiedzie? –

+1

@SubodhJoshi Tak, liczba całkowita zezwala na wartość null, więc kompilator nie będzie mógł wybrać między 'JavaTest (String arg)' i 'JavaTest (Integer obj)'. – Eran

+0

Przepraszam, ale nie jestem w stanie zrozumieć, jaki jest problem z 'JavaTest (String arg)' i 'JavaTest (Integer obj)' ..Gdy kompilator może wybierać pomiędzy 'JavaTest (String arg)' i 'JavaTest (Object obj) 'Wiemy, że' Object' może mieć wartość 'Null',' String' może mieć wartość 'Null', a' Integer' może mieć wartość 'Null'? –

Powiązane problemy