Я думаю, что лямбда-выражение правильно и
функция фильтра немного неправильная, но я не могу выяснить
ошибка ...
Вы правы.
Ваш метод, кажется, побеждает универсальный тип, объявленный для класса, поскольку в первую очередь ваш метод определен внутри универсального класса.
Предположим, что ваш класс назван Foo
, здесь метод filter()
использует общий тип T
в качестве типа возврата / параметра:
public class Foo<T>{
// ...
public Optional<T> filter(Predicate<T> tester) {
// ...
}
}
Работает с выводом.
Таким образом, вы получаете Predicate
из T
. Но T
зависит от универсального типа, определенного в классе, а также от способа, которым вы объявили экземпляр класса Foo
.
И похоже, что здесь T
не является Number
.
В качестве альтернативы вы также можете рассчитывать на вывод из объявленной переменной Foo.
Если вы сделаете это:
Foo<Integer> foo = new Foo<>();
Optional<Integer> optInt = foo.filter(v -> v > 5);
будет компилироваться нормально, так как Integer
будет выведено из Foo<Integer>
.
Так что я думаю, что для решения вашей проблемы вы должны объявить Number или Integer в качестве базового класса универсального типа:
public class Foo<T extends Integer>{
// ...
public Optional<T> filter(Predicate<T> tester) {
// ...
}
}
или полагаться на вывод клиента, как в предыдущем примере.