Вы не можете использовать переменную test
анонимной функции, которая реализует как Function<Integer, Integer>
, так и Function<String, String>
(что, кстати, тот же интерфейс).
Однако вы можете иметь вложенный класс с перегруженным методом apply
и в конечном итоге построить его с помощью лямбда-функций. Этот вложенный класс не должен (и не может) реализовывать как Function<Integer, Integer>
, так и Function<String, String>
. Но, как показано в следующем примере, вы на самом деле не нужен реализуют эти интерфейсы:
static class FunctionOverload {
private final Function<String, String> stringFunction;
private final Function<Integer, Integer> integerFunction;
FunctionOverload(Function<String, String> stringFunction, Function<Integer, Integer> integerFunction) {
this.stringFunction = stringFunction;
this.integerFunction = integerFunction;
}
public String apply(String string) {
return this.stringFunction.apply(string);
}
public Integer apply(Integer integer) {
return this.integerFunction.apply(integer);
}
}
public static void main(String[] args) {
FunctionOverload test = new FunctionOverload(x -> x + x, x -> x + x);
test.apply("5");
test.apply(5);
Stream.of("5").map(test::apply);
Stream.of(5).map(test::apply);
}
Вместо того чтобы использовать функции вы можете обсчитывать к UnaryOperator –
TechTrip