Используя потоки и дженерики Java, я пытаюсь создать Collector, который вернет мне Optional.empty, если поток пуст, Optional<T>, если в потоке есть один элемент, и вызовет исключение, если в потоке более одного элемента.
public static <T, R extends Optional<T>> Collector<T, ?, R> toOptional() {
return Collectors.collectingAndThen(
Collectors.toList(),
list -> {
if (list.size() > 1) {
throw new CollectingException("More than one item found in: " + list);
}
if (list.size() == 1) {
return Optional.of(list.get(0));
}
return Optional.empty();
}
);
}
Однако я получаю сообщение об ошибке, которое я не понимаю.
Required type:
Collector<T,?,R>
Provided:
Collector<Object,Object,Object>
no instance(s) of type variable(s) T exist so that Optional<T> conforms to R inference variable RR has incompatible bounds: equality constraints: R lower bounds: Optional<T1868063>
Желаемое использование будет
List<Person> people = new ArrayList<>();
Optional<Person> john = people.stream().filter(person->"John".equals(person.getName())).collect(toOptional());
Может ли кто-нибудь объяснить мне, что не так?




Объявление вашего метода неверно, вместо:
public static <T, R extends Optional<T>> Collector<T, ?, R> toOptional() {
Вы можете просто использовать:
public static <T> Collector<T, ?, Optional<T>> toOptional() {
Другими словами, метод должен возвращать Optional объект типа T напрямую, вместо использования отдельного параметра типа R, который расширяет Optional<T>.