Лямбда с универсальным типом - PullRequest
0 голосов
/ 10 октября 2018

В Java у меня есть следующая лямбда:

Function<? extends Number, Boolean> f = i -> true;

Далее я хочу использовать эту лямбду следующим образом:

public <T extends Number> Boolean use(T n) {
  return f.apply(n);
}

Но компилятор выдает 'несовместимые типы: T не можетбыть преобразован, чтобы захватить # 1 из?extends java.lang.Number '

Так в чем же причина и как я могу использовать свою определенную функцию?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Вы хотите, чтобы "потреблять" элементы через Function определение должно быть:

static Function<? super Number, Boolean> f = i -> true;

Дело в том, что эти определения не связаны, вы можете предоставить Function некоторого типа, которыйрасширяет Number, в то время как ваш use метод может использовать некоторый другой тип, который расширяет Number.

Либо создайте один класс, объединяющий эти два вместе (как показал Эран);или объявите свой Function, который займет Number;или что-нибудь, что может быть по крайней мере Number через ? super Number

0 голосов
/ 10 октября 2018

Проблема с применением Function<? extends Number, Boolean> f = i -> true; в вашем методе <T extends Number> Boolean use(T n) заключается в том, что вы можете назначить f функцию, которая принимает аргументы одного подкласса Number (скажем, Double), в то время как ваш useМетод попытается передать ему экземпляр другого подкласса Number (скажем, Integer).

Вы можете изменить определение Function на

Function<Number, Boolean> f = i -> true;

, котороебудет принимать любой тип extends Number в качестве аргумента.

Или вы можете определить и Function, и метод в одном универсальном классе, который будет гарантировать, что аргументы, переданные в use(), должны соответствоватьаргумент, ожидаемый f:

class Generic<T extends Number> {
    Function<T, Boolean> f = i -> true;

    public Boolean use(T n) {
        return f.apply(n);
    }
}
...