Это простая часть, которую я всегда использую, чтобы показать загрузку.
, скажем, это наш контейнер
<div id='container'>
<img id="spinner" src="/assets/chart_loader.gif"/>
</div>
И это кусок ajax, который заботится о показать, когда getJson начинается для графика и скрывается, когда он останавливается.
$(document).ajaxStart ->
$("#spinner").show()
$(document).ajaxComplete ->
$("#spinner").hide()
Согласно Спецификации языка Java , в таких случаях перегруженных методов, когда оба метода могут обрабатывать предоставленные аргументы, выбирается метод с более конкретным аргументом. Поскольку String
более конкретен, чем Object
( String
extends Object
), выбран метод void (String)
и позвонил.
Это точно так, как указано в 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
(или другое выражение) к желаемому типу перегрузки.
Я вполне уверен, что с Java 6 (я думаю, что Java 5 вызвала бы ошибку компилятора) в таком случае, он выберет класс низшего уровня для присвоения значения null. (поскольку String является объектом, он находится ниже в иерархии)
Компилятор всегда найдет наиболее узкое возможное совпадение при разрешении вызовов перегруженных методов.
Между прочим, в Java для классов используются имена в верхнем регистре, например Другой
.