Проблема связана с тем, как вывод работает в Java: это зависит от цели.
Здесь:
Predicate<Integer> predicate = Predicate.isEqual(0)
.or(Predicate.isEqual(1));
Тип, возвращаемый or(Predicate.isEqual(1))
, зависит от типа, возвращаемого Predicate.isEqual(0)
(ближайшей целью), но этот вызов не указывает какой-либо другой тип в качестве возвращаемого.
Так Object
возвращается or(Predicate.isEqual(1))
как метод isEqual()
определяет T
как тип возвращаемого значения без подстановочных знаков:
static <T> Predicate<T> isEqual(Object targetRef) {
Чтобы решить вашу проблему, вам действительно нужно указать тип возврата первого вызова, чтобы позволить цепочечному вызову вывести правильный тип: Integer
.
Predicate<Integer> predicate = Predicate.<Integer>isEqual(0)
.or(Predicate.isEqual(1));