Скажем, у меня есть следующий интерфейс:
@FunctionalInterface
public interface First {
int fun(int a);
}
а также
@FunctionalInterface
public interface Second extends First {
default int fun(int a) { fun(a, a); }
int fun(int a, int b);
}
Затем, если у меня где-то есть метод, который принимает First
, я могу сделать, например:
methodThatTakeFirst(val -> val + 1);
Но я также хочу иметь возможность передавать Second
, например:
methodThatTakeFirst((v1, v2) -> v2 * v2);
Однако это работает только в том случае, если я использую лямбду следующим образом:
methodThatTakeFirst((Second) (v1, v2) -> v2 * v2);
Мой вопрос: есть ли способ разработать этот шаблон без необходимости приведения лямбда-выражений к субинтерфейсу? Или что было бы самым элегантным способом справиться с этими сценариями?
default
функции в вашем функциональном интерфейсе для обработки дополнительного поведения вместо того, чтобы навязывать то, что выглядит как ненужное наследование? - person Makoto   schedule 08.11.2017Second
. Приведение типов — лучший/самый простой способ сообщить об этом компилятору, поэтому приведение типов является наиболее элегантным способом справиться с этим сценарием. - person Andreas   schedule 08.11.2017First
нельзя изменить, что дает передача реализацииSecond
, особенно лямбда-выражения? Единственное, что методmethodThatTakeFirst()
может разумно сделать со своим аргументом, — это вызвать методfun(int a)
, который по умолчанию используется вSecond
. Вам лучше определить конкретную реализациюFirst
и передать ее обычный экземпляр. - person John Bollinger   schedule 08.11.2017