(Примечания: есть аналогичный вопрос для C#, но я не нашел его для Java. Вопросы для Java о «хранении лямбда-выражения в переменной» всегда относятся к случаи, когда тип переменной был исправлен - это именно то, что я пытаюсь обойти)
Лямбда-выражения получают нужный тип посредством вывода целевого типа. Все это обрабатывается компилятором. Например, функции
Код: Выделить всё
static void useF(Function f) { ... }
static void useP(Predicate p) { ... }
Код: Выделить всё
useF(x -> true);
useP(x -> true);
Но, к сожалению, нет способа сохранить лямбда-выражение с типом, применимым к обеим функциям, как в
Код: Выделить всё
GenericLambdaTypeКод: Выделить всё
lambda = x -> true;Код: Выделить всё
(Ljava.lang.Integer)Ljava.lang.BooleanКод: Выделить всё
lambda = x -> true;Так есть ли любой способ предотвратить преобразование лямбда-выражения в один конкретный тип?
В частности, существует ли какой-нибудь трюк или обходной путь, позволяющий вызывать методы useF и useP, описанные выше, с одним и тем же объектом, как в
Код: Выделить всё
useF(theObject);
useP(theObject);
Код: Выделить всё
useF(convertToRequiredTargetType(theObject));
useP(convertToRequiredTargetType(theObject));
Обратите внимание, что этот вопрос больше не подходит любопытства. Поэтому я буквально ищу любой способ добиться этого (кроме пользовательских прекомпиляторов или манипуляций с байт-кодом).
Похоже, простых обходных путей не существует. Наивная попытка отложить выведение типа, заключая выражение в универсальный вспомогательный метод, как в
Код: Выделить всё
static T provide()
{
return x -> true;
}
Подробнее здесь: https://stackoverflow.com/questions/363 ... xpressions
Мобильная версия