Непосредственная проблема заключается в том, что тип возвращаемого значения of
является необработанным:
public static<T> If of(T t, Predicate predicate) {
Возможно, вам нужно что-то вроде:
public static<T> If<T, Something> of(T t, Predicate<T> predicate) {
Я бы сказал, что вы на самом деле не хотите испечь R
типа If
. Если вы вместо этого объявите его в методе, у вас будет возможность apply
указать его для любого типа:
public class If<T> {
// ...
public <R> If<R> apply(Function<T, R> function) {
if(predicate!=null && predicate.test(t)){
return new If<>(function.apply(t), null);
}
return If.of(this.t, null);
}
// ...
}
Тогда ваша подпись of
может быть просто:
public static<T> If<T> of(T t, Predicate<T> predicate) {
Если вы хотите, чтобы ваш API был более гибким, добавьте подстановочные знаки:
public static<T> If<T> of(T t, Predicate<? super T> predicate) {
и
public <R> If<R> apply(Function<? super T, ? extends R> function) {