Как двусмысленность в выборе перегруженных методов, разрешенных на Java?

package org.study.algos; public class Study { public static void main(String[] args) { A a = new A(); a.m1(null); } } class A { public void m1(String s) { System.out.println("String"); System.out.println(s); } public void m1(Object obj) { System.out.println("Object"); System.out.println(obj); } } 

Здесь вывод

String null

Почему JVM разрешает метод одному с аргументом String?

Заранее спасибо J

Это довольно сложный алгоритм, подробно описанный в JLS 15.12 . Но здесь важна часть 15.12.2 , в которой говорится, что «выбран наиболее конкретный». Перегрузки объектов и строк являются «доступными и применимыми» (применяется String, поскольку нулевой литерал является ссылкой всех типов), а строка более конкретна.

EDIT: Исправлена ​​секция за синтаксику.

Эти методы «перегружены», а не «неоднозначны».

Согласно спецификации языка Java :

Когда метод вызывается (§15.12), количество фактических аргументов (и любых явных аргументов типа) и типы времени компиляции аргументов используются во время компиляции для определения сигнатуры метода, который будет вызываться ( §15.12.2).

И в §15.12.2 говорится:

Может быть более одного такого метода, и в этом случае выбирается наиболее конкретный .

String более специфична, чем Object , поэтому, когда null совместим с обоими, выбран метод с параметром String (существуют более сложные правила, применяемые, когда типы параметров являются частью иерархии classов или интерфейсов).

Значение null может быть установлено для ссылки любого типа. Все перегруженные вами методы находятся в одной иерархии наследования Object <- String, выбирается наименее общий. Но если у вас было два перегруженных метода, которые не находятся в одной иерархии, тогда вы получите ошибку компиляции об однозначных методах.

Строка – это объект, объект не является строкой, поэтому первая перегрузка более конкретна, чем вторая. См. JLS 15.12.2 , как упоминалось в Syntactic.

Я задал аналогичный вопрос. Джон Скит написал большой ответ.

Ссылка на мой вопрос: какая перегрузка будет выбрана для null в Java?

  • Как сортировать дату, которая находится в формате строки в java?
  • Проверьте ориентацию на телефоне Android
  • Активность Android ClassNotFoundException - все
  • Вибрация с длительностью и узором
  • Android - создание CSV-файла из значений таблицы
  • Где останавливать / уничтожать streamи в classе Android Service?
  • В чем разница между этим и Activity.this
  • Загрузить профиль Chrome с помощью Selenium WebDriver с помощью java
  • Изменение цвета нижней строки EditText с помощью appcompat v7
  • Создайте новый TextView программно, затем отобразите его под другим TextView
  • Как удалить данные из базы данных после «n» дней
  • Interesting Posts
    Давайте будем гением компьютера.