Как мне специализировать тип в прямом объявлении функционального интерфейса?

#java

#java

Вопрос:

Недавно мне пришла в голову идея создать следующий метод:

 /** Returns a {@link Predicate} which tests whether all its elements match a condition passed as argument. */
private static <T> Predicate<Iterable<T>> allIterableElementsMatch(Predicate<T> elementMatchCondition) { 
    return iterable -> stream(iterable).allMatch(elementMatchCondition);
}
  

Затем я решил объявить Function -field вместо объявления метода выше.
Самое близкое некомпилируемое решение, которое я мог бы предоставить, это:

 private static final Function<Predicate<?>, Predicate<Iterable<?>>> allIterableElementsMatch = 
    condition -> iterable -> stream(iterable).allMatch(condition);
  

Это не компилируется (IDE выделяется condition внутри allMatch(...) ) по следующей причине:

Мои вопросы:

  1. Возможно ли это реализовать таким образом, или я просто неправильно понимаю концепцию использования функциональных интерфейсов?
  2. Возможно ли специализировать некоторый тип в Function объявлении -s, как в методе, который я показал?

Ответ №1:

Для системы типов ? from Predicate<?> и ? from Predicate<Iterable<?>> — это разные вещи. Вы можете сделать:

 private static <T> Function<Predicate<T>, Predicate<Iterable<T>>> func() {
    return condition -> iterable -> StreamSupport.stream(iterable.spliterator(), false).allMatch(condition);
}
  

Комментарии:

1. Здравствуйте. Спасибо за ваш ответ. Идея в том, что я хотел бы объявить поле, но не метод. Возможно ли это, по вашему мнению?

2. @GromovAnton нет, это не так, возможно, вы захотите подробнее прочитать о методах «захвата подстановочных знаков»…

3. в заключение, в этом случае нет способа сообщить компилятору, что оба ‘?’ относятся к одному и тому же типу, я прав?

4. @GromovAnton да, это правильно. говорят, что преобразование захвата происходит везде