Ниже приведен пример из JLS 15.13.1:
Пример двусмысленности:
Код: Выделить всё
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;
// Error: instance method size()
// or static method size(Object)?
}
}
Согласно JLS 15.13.1 (сохраните соответствующие части):
• Сначала определяется тип для поиска:
– Если выражение ссылки на метод имеет форму
Код: Выделить всё
ReferenceType ::[TypeArguments] Identifierпреобразования захвата (§5.1.10), примененного к ReferenceType.
Таким образом, Типом для поиска является тип класса C.
• Во-вторых, для заданного типа целевой функции с n параметрами набор Идентифицированы
потенциально применимые методы:
– если выражение ссылки на метод имеет форму
Код: Выделить всё
ReferenceType :: [TypeArguments] Identifierто потенциально применимые методы:
› методы-члены типа для поиска, который будет потенциально
применимо (§15.12.2.1) для вызова метода, имя которого
Идентификатор, имеет разрядность n, имеет аргументы типа TypeArguments и появляется
в том же классе в качестве выражения ссылки на метод; плюс
› методы-члены искомого типа, которые потенциально
применимы для вызова метода с именем Identifier, имеющего арность
Код: Выделить всё
n-1, что и выражение ссылки на метод.
Таким образом, методы имеют размер int () и int size(Object arg) все потенциально применимы.
Правила потенциально применимые также требуют, чтобы параметры и аргументы были потенциально совместимыми. Нет ли здесь необходимости, потому что типы аргументов для вызова не упомянуты?
Подробнее здесь: https://stackoverflow.com/questions/791 ... ce-illegal
Мобильная версия