0

I'm fairly new to generics here and would like some assistance.

I'm trying to create a Generic method with a Generic Predicate, a Generic java.util Function, a Generic List as arguments. The method is like this:

public static <T> T getValue(Predicate<? super Object> condition, Function<? super Object, ? extends Object> mapper, T elseResult, List<T> table) {
        T result = null;
        if (table != null)
            result = table.stream()
                    .filter(condition)
                    .map(mapper).findAny().orElse(elseResult); // Syntax error here.
        else
            result = elseResult;

        return (T) result;
    }

I'm getting an error on the orElse(elseResult) method. This is the error -

The method orElse(capture#1-of ? extends Object) in the type Optional<capture#1-of ? extends Object> is not applicable for the arguments (T).

I'm not exactly sure as to what this error is about. So could someone tell me what I'm doing wrong here? Thanks.

Naman
  • 27,789
  • 26
  • 218
  • 353
AlanC
  • 133
  • 9
  • `static T getValue(Predicate super T> condition, Function super T, T> mapper, T elseResult, List table)` should do it for you. – Naman Mar 22 '20 at 09:20

1 Answers1

0

Your mapper can return anything, so your orElse method will not necessarily return a T.

If you change your mapper to Function<T,T> mapper, your code will pass compilation.

If you want your mapper to be able to return a different type, add a second type argument:

public static <T,S> S getValue(Predicate<? super Object> condition, Function<T,S> mapper, S elseResult, List<T> table) {
    S result = null;
    if (table != null)
        result = table.stream()
                .filter(condition)
                .map(mapper).findAny().orElse(elseResult);
    else
        result = elseResult;

    return result;
}
Eran
  • 387,369
  • 54
  • 702
  • 768