Почему вывод такой?

Это простая часть, которую я всегда использую, чтобы показать загрузку.

, скажем, это наш контейнер

<div id='container'>
  <img id="spinner" src="/assets/chart_loader.gif"/>
</div>

И это кусок ajax, который заботится о показать, когда getJson начинается для графика и скрывается, когда он останавливается.

$(document).ajaxStart ->
  $("#spinner").show()

$(document).ajaxComplete ->
  $("#spinner").hide()
13
задан Chetan 15 January 2013 в 05:41
поделиться

4 ответа

Согласно Спецификации языка Java , в таких случаях перегруженных методов, когда оба метода могут обрабатывать предоставленные аргументы, выбирается метод с более конкретным аргументом. Поскольку String более конкретен, чем Object ( String extends Object ), выбран метод void (String) и позвонил.

25
ответ дан 1 December 2019 в 19:07
поделиться

Это точно так, как указано в JLS:

JLS 15.12.2.5 Выбор наиболее конкретного метода

Если более одного метода-члена доступны и применимы к вызову метода, он необходимо выбрать один, чтобы предоставить дескриптор для отправки метода времени выполнения. В языке программирования Java используется правило, согласно которому выбирается наиболее конкретный метод .

A Строка - это Объект , но не все Объект - это Строка . Следовательно, String более конкретен , чем Object , поэтому в приведенном выше примере выбрана перегрузка String .


Стоит отметить, что именно этот вопрос (по сути) появился в замечательных Java Puzzlers (настоятельно рекомендуется), в частности Головоломка 46: Случай сбивающего с толку Constructor

Процесс разрешения перегрузки Java работает в два этапа. На первом этапе выбираются все доступные и применимые методы или конструкторы. На втором этапе выбираются наиболее конкретные из методов или конструкторов, выбранных на первом этапе.Один метод или конструктор менее специфичен, чем другой, если он может принимать любые параметры, переданные другому

Ключ к пониманию этой загадки состоит в том, что тест, для которого метод или конструктор наиболее специфичен, не использует фактические параметры : параметры, появляющиеся при вызове. Они используются только для определения возможных перегрузок. Как только компилятор определяет, какие перегрузки применимы и доступны, он выбирает наиболее конкретную перегрузку, используя только формальные параметры : параметры, указанные в объявлении.


В заключение я приведу цитату из Эффективное 2-е издание Java , Правило 41: разумно используйте перегрузку :

Правила, определяющие, какая перегрузка выбрана, чрезвычайно сложны. Они занимают тридцать три страниц в спецификации языка, и немногие программисты понимают все их тонкости.

Излишне говорить, что эта книга также настоятельно рекомендуется .

См. Также


При явном приведении типов

Итак, как я могу вызвать перегрузку Object с аргументом null ?

Просто: приведите null , чтобы ввести Объект . Есть несколько сценариев, когда это полезно / необходимо, и это один из них.

Что делать, если у меня есть перегрузка, которая принимает, скажем, Integer ?

Тогда вызов метода неоднозначный , и возникает ошибка времени компиляции.

JLS 15.12.2.5 Выбор наиболее специфичного метода

Возможно, что ни один метод не является наиболее специфичным, потому что существует два или более методов, которые являются максимально специфичными. В этом случае [... за некоторыми исключениями] мы говорим, что вызов метода неоднозначен , и возникает ошибка времени компиляции.

Чтобы устранить неоднозначность, снова можно привести null (или другое выражение) к желаемому типу перегрузки.

См. Также

7
ответ дан 1 December 2019 в 19:07
поделиться

Я вполне уверен, что с Java 6 (я думаю, что Java 5 вызвала бы ошибку компилятора) в таком случае, он выберет класс низшего уровня для присвоения значения null. (поскольку String является объектом, он находится ниже в иерархии)

1
ответ дан 1 December 2019 в 19:07
поделиться

Компилятор всегда найдет наиболее узкое возможное совпадение при разрешении вызовов перегруженных методов.

Между прочим, в Java для классов используются имена в верхнем регистре, например Другой .

5
ответ дан 1 December 2019 в 19:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: