Как я могу создать массив или список функций в Java 17 (или аналогичном)?
Ожидаемое гипотетическое использование:
var myListOfFunctions = List.of(this::myFunction, MyClass::someOtherFunction);
Я получаю следующую ошибку:
Объект не является функциональным интерфейсом
Я намерен передавать функции и передавать им одни и те же данные.
Да, естественно.
Проблема в том, что информации о типе недостаточно, чтобы сделать вывод о параметризации List, поэтому по умолчанию используется List<Object>. Либо замените var фактическим типом (например, List<Function<Foo, Bar>>), либо используйте свидетельство типа (например, List.<Function<Foo, Bar>>of(...)). Замените Function<Foo, Bar> фактическим типом, который вы используете.
Я не знал о свидетелях типов (List.<TypeHere>) до ответа @NoDataFound. Спасибо за дополнительный контекст.




Вы должны немного помочь Java для этого:
var myListOfFunctions = List.<Function<String,Integer>> of(this::myFunction, MyClass::someOtherFunction);
Это сгенерирует List<Function<String, Integer>>.
Или просто не используйте var...
Зависит от прихоти компилятора: я почти уверен, что JDT (Eclipse) здесь не сработает.
Спасибо. Это сработало. Это была простая сигнатура с одним входом и одним выходом, так что это лучше всего подходит для моих нужд.
Во-первых, создайте функциональный интерфейс, представляющий общую сигнатуру всех функций. Примечание: может быть интерфейс из пакета java.util.function, который можно использовать для представления подписи, поэтому может не потребоваться создавать новый интерфейс.
// for example
@FunctionalInterface
interface MyFunction {
int f(int a, int b); // this must match the signature of each function
}
Затем создайте List этого типа.
List<MyFunction> functions = List.of(this::myFunction, MyClass::someOtherFunction);
Спасибо, это кажется более полным, подходящим для более широкого круга посетителей, ищущих ответ на этот вопрос.
Все ли функции имеют одинаковую сигнатуру?