Во-первых, давайте рассмотрим пример:
Код: Выделить всё
interface Fun { R apply(T arg); }
class C {
int size() { return 0; }
static int size(Object arg) { return 0; }
void test() {
Fun f1 = C::size;
}
}
Согласно JLS 15.13.1:
Очевидно, тип для поиска — это тип класса C.
И тогда:
• Во-вторых, учитывая целевой тип функции с n параметрами, определяется набор
потенциально применимых методов:
- Если ссылочное выражение метода
имеет форму ReferenceType :: [TypeArguments]
Идентификатор, то потенциально применимыми методами являются:
член
методы типа для поиска, которые потенциально могут быть применимы
(§15.12.2.1) для вызова метода, который называет Identifier, имеет арность
n, имеет аргументы типа TypeArguments и появляется в тот же класс, что и
выражение ссылки на метод; плюс - методы-члены типа
для поиска, которые потенциально могут быть применимы для вызова метода
, который называет Identifier, имеет арность n-1, имеет аргументы типа
TypeArguments и отображается в том же классе, что и ссылочное
выражение метода.
В соответствии с JLS теперь предположим, что существует вызов метода: «идентификатор имен, имеет разрядность n, имеет аргументы типа TypeArguments и находится в том же классе, что и метод». ссылочное выражение", а затем определить, является ли этот предполагаемый вызов метода потенциально применимым с двумя методами-членами, присутствующими в классе C.
Они имеют одинаковое имя и та же арность.
И поскольку предложение «и появляется в том же классе, что и выражение ссылки на метод», класс, в котором происходит вызов метода, определяется так, чтобы вынести суждение. предложения «Член доступен (§6.6) для класса или интерфейса, в котором появляется вызов метода». (15.12.2.1)
А как насчет совместимости? Он не предоставляет типы аргументов предполагаемого вызова метода.
Как вынести суждение
" Если элемент является методом фиксированной арности с арностью n, арность
вызова метода равна =n, и для всех i (1 ≤ i ≤ n) i-й
аргумент вызов метода потенциально совместим, как
определено ниже, с типом i-го параметра метода."
?(15.12.2.1)
Другими словами, это не просто статический размер int(Object arg). Если у меня тоже есть
Код: Выделить всё
static int size(String arg)Спасибо, что прочитали и ответили.
Я не думаю, что мой вопрос похож на этот. Если только оценивать потенциальную применимость методов-членов и вызовов методов. , спецификации четко написаны. Ссылки на методы здесь задействованы. Насколько я понимаю, согласно спецификации, метод-член будет сравниваться с предполагаемым вызовом. Однако для этого предполагаемого вызова информации, предоставленной спецификацией, кажется недостаточно.
Подробнее здесь: https://stackoverflow.com/questions/791 ... ce-in-java
Мобильная версия