Подтвердить что ты не робот

Каков тип в null как аргумент метода?

Итак, вот этот пример

public static void main(String[] args) {        
    new Stuff(null);
    new Stuff("a");
    new Stuff(1);           
}

и класс Stuff определяется следующим образом:

public class Stuff {    
       Stuff(Object o){
           System.out.println("object");        
       }

       Stuff(String s){
           System.out.println("string");        
       }

}

Выходной сигнал

string
string
object

Как Java сообщает, что null - это String? Если я изменю Stuff на

public class Stuff {    

       Stuff(String s){
           System.out.println("string");        
       }

       Stuff(Integer o){
           System.out.println("Integer");           
       }

}

Я получаю ошибку компиляции для Stuff(null):

The constructore Stuff(String) is ambigous. 

Опять же, почему Java "решает" null - это String?

4b9b3361

Ответ 1

  • В компиляторе перечислены все применимые методы. В вашем случае оба варианта применимы.
  • Затем он пытается найти метод, который более специфичен, чем другой (ы).
  • В вашем первом примере String является подклассом Object и, следовательно, более конкретным.
  • В вашем втором примере оба метода применимы (String и Integer), но ни один из них не является более конкретным, чем другой (String не является подклассом Integer, который не является подклассом String). Таким образом, существует двусмысленность, следовательно, ошибка компилятора.

Полный алгоритм для определения того, какой метод следует выбрать, определяется в JLS.

Ответ 2

Потому что String более конкретна, чем Object. Java всегда пытается использовать более конкретное соответствие при определении того, какой конструктор или метод использовать.