使用Java Streams和泛型,我试图创建一个Collector,如果stream为空,则返回Optional.empty,如果stream有一个项,则返回Optional<T>,如果stream有多个项,则抛出异常.

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() {

换句话说,该方法需要直接返回类型TOptional对象,而不是使用扩展Optional<T>的单独类型参数R.

Java相关问答推荐

Spicejet日历处理-使用Selenium Java

在没有maven或IDE的情况下从命令行运行PFA模块化应用程序时出现神秘错误

Listview—在Android Java中正确链接项目时出错

在AnyLogic中增加变量计数

尽管类型擦除,instanceof与泛型在Java中如何工作?

屏蔽字母数字代码的Java正则表达式

有关手动创建的包的问题

调用引发泛型异常的泛型方法时出现编译错误

不推荐使用的Environment.getExternalStorageDirectory().getAbsolutePath()返回的值不同于新的getExternalFilesDir(空)?

如何调整工作时间日历中的时间

内存中的H2修剪尾随空格

放气总是压缩整个街区吗?

Java中将文本拆分为数字或十进制数字和字符串

Java连接池无法正常工作

解析方法";javax/imageio/metadata/IIOMetadata.getAsTree(Ljava/lang/String;)Lorg/w3c/dom/Node时加载约束冲突

无法播放音频:从资源加载库GStreamer-Lite失败

如何在透视表中添加对计数列的筛选?

Java组件项目中的JavaFX对话框国际化

ReturnedRect在升级后反转

如何显示新布局