Java8流编译器问题

Java8流编译器问题,java,intellij-idea,Java,Intellij Idea,我在IDE中的一个项目IntelliJ上随意地工作。它根本没有显示任何错误,但我一编译,就出现了一个不允许我构建项目的错误 我第一次尝试更新我的JDK,因为我仍然在更新65。我更新到了最新的可用版本(当时是u101),但运气不好:问题仍然存在。这是相关代码: ((List<?>) value).stream().filter(this::isStringOrPrimitive) .map(val -> getCommand

我在IDE中的一个项目IntelliJ上随意地工作。它根本没有显示任何错误,但我一编译,就出现了一个不允许我构建项目的错误

我第一次尝试更新我的JDK,因为我仍然在更新65。我更新到了最新的可用版本(当时是u101),但运气不好:问题仍然存在。这是相关代码:

((List<?>) value).stream().filter(this::isStringOrPrimitive)
                            .map(val -> getCommandHandler(command, plugin, val.toString()))
                            .forEach(result::add);
我尝试了几件事来看看它是否会影响任何事情:

  • 使用强制转换(CommandHandler.class::cast)映射流,但未修复该问题
  • 删除方法引用,并用普通方法调用(val->result.add(val))替换它。也没修好
  • 作为最后一个选项,我使用方法调用并将val强制转换为CommandHandler。这解决了这个问题,但我不喜欢我必须手动转换到CommandHandler,而Java可以自己做

我也可以完全摆脱流,但我想首先看看这是不是某种编译器问题,或者我是否做错了什么。谢谢您的时间。

奇怪的编译器行为。尝试提取初始流并提供类型参数

Stream<?> stream = ((List<?>) value).stream();
stream.filter(this::isStringOrPrimitive)
    .map(val -> getCommandHandler(command, plugin, val.toString()))
    .forEach(result::add);
Stream=((列表)值).Stream();
stream.filter(this::isStringOrPrimitive)
.map(val->getCommandHandler(命令、插件、val.toString()))
.forEach(结果::添加);

对于我的代码,它帮助编译器正确推断管道中其他步骤的类型。

尝试在lambda中使用显式参数类型,并在泛型方法中使用显式类型参数。然后一次移除一个,看看问题出在哪里。我第一次尝试了这个方法,但不幸的是没有解决问题。我确实使用了你的外化思想,使变量成为一个流,一直到映射之后。然后在变量上调用.forEach确实修复了它,谢谢您的指导!
private <T, C> CommandHandler getCommandHandler(Command<T, C> command,
                                                AnimatedMenuPlugin plugin, String str) {
Error:(59, 42) java: incompatible types: invalid method reference
no suitable method found for add(java.lang.Object)
    method java.util.Collection.add(me.megamichiel.animatedmenu.command.CommandExecutor.CommandHandler) is not applicable
      (argument mismatch; java.lang.Object cannot be converted to me.megamichiel.animatedmenu.command.CommandExecutor.CommandHandler)
    method java.util.List.add(me.megamichiel.animatedmenu.command.CommandExecutor.CommandHandler) is not applicable
      (argument mismatch; java.lang.Object cannot be converted to me.megamichiel.animatedmenu.command.CommandExecutor.CommandHandler)
    method java.util.AbstractCollection.add(me.megamichiel.animatedmenu.command.CommandExecutor.CommandHandler) is not applicable
      (argument mismatch; java.lang.Object cannot be converted to me.megamichiel.animatedmenu.command.CommandExecutor.CommandHandler)
    method java.util.AbstractList.add(me.megamichiel.animatedmenu.command.CommandExecutor.CommandHandler) is not applicable
      (argument mismatch; java.lang.Object cannot be converted to me.megamichiel.animatedmenu.command.CommandExecutor.CommandHandler)
    method java.util.ArrayList.add(me.megamichiel.animatedmenu.command.CommandExecutor.CommandHandler) is not applicable
      (argument mismatch; java.lang.Object cannot be converted to me.megamichiel.animatedmenu.command.CommandExecutor.CommandHandler)
Stream<?> stream = ((List<?>) value).stream();
stream.filter(this::isStringOrPrimitive)
    .map(val -> getCommandHandler(command, plugin, val.toString()))
    .forEach(result::add);