在使用通用类型的 super 将 Map 流式传输到 Consumer 后使用 orElse 编译错误
Compile error using orElse after streaming Map to Consumer with super in generic type
我 运行 在使用 Optional.orElse(..) 方法时出现意外的编译错误。我有一个带有通用类型 E 的 class,我正在尝试通过消费者进行过滤以找到足够的消费者,如果过滤没有结果,则使用提供的消费者。生成的 Consumer 稍后将用于接受类型 E 的元素。为了清楚起见,我已经注释掉了过滤步骤。
使用消费者列表时,一切正常:
// List of Consumer of super of c: works!
public void listMethod(Consumer<? super E> defaultConsumer) {
List<Consumer<? super E>> list = new ArrayList<>();
Consumer<? super E> consumer = list.stream()
//.filter(/*Some filtering which is not relevant*/)
.findAny()
.orElse(defaultConsumer);
}
但是,当使用任何事物的Map到Consumer时,在orElse处出现编译错误:
//Map of Object to Consumer of super of C: compile error on orElse
public void mapMethod(Consumer<? super E> defaultConsumer) {
Map<Object, Consumer<? super E>> map = new HashMap<>();
Consumer<? super E> consumer = map.entrySet()
.stream()
//.filter(/*Some filtering which is not relevant*/)
.map(Map.Entry::getValue)
.findAny()
.orElse(defaultConsumer);
}
错误信息是:
The method orElse(Consumer<capture#3-of ? super E>) in the type Optional<Consumer<capture#3-of ? super E>> is not applicable for the arguments (Consumer<capture#6-of ? super E>)
谁能澄清这里出了什么问题?谢谢:)
编辑:这是在 jdk1.8 上。0_45。
这似乎是 Eclipse Mars Java 编译器的问题。
Eclipse有自己的编译器,不使用javac
。
javac 1.8.0_45
在我的机器上没有问题,而 Eclipse Mars 显示了您所描述的错误。
我 运行 在使用 Optional.orElse(..) 方法时出现意外的编译错误。我有一个带有通用类型 E 的 class,我正在尝试通过消费者进行过滤以找到足够的消费者,如果过滤没有结果,则使用提供的消费者。生成的 Consumer 稍后将用于接受类型 E 的元素。为了清楚起见,我已经注释掉了过滤步骤。
使用消费者列表时,一切正常:
// List of Consumer of super of c: works!
public void listMethod(Consumer<? super E> defaultConsumer) {
List<Consumer<? super E>> list = new ArrayList<>();
Consumer<? super E> consumer = list.stream()
//.filter(/*Some filtering which is not relevant*/)
.findAny()
.orElse(defaultConsumer);
}
但是,当使用任何事物的Map到Consumer时,在orElse处出现编译错误:
//Map of Object to Consumer of super of C: compile error on orElse
public void mapMethod(Consumer<? super E> defaultConsumer) {
Map<Object, Consumer<? super E>> map = new HashMap<>();
Consumer<? super E> consumer = map.entrySet()
.stream()
//.filter(/*Some filtering which is not relevant*/)
.map(Map.Entry::getValue)
.findAny()
.orElse(defaultConsumer);
}
错误信息是:
The method orElse(Consumer<capture#3-of ? super E>) in the type Optional<Consumer<capture#3-of ? super E>> is not applicable for the arguments (Consumer<capture#6-of ? super E>)
谁能澄清这里出了什么问题?谢谢:)
编辑:这是在 jdk1.8 上。0_45。
这似乎是 Eclipse Mars Java 编译器的问题。
Eclipse有自己的编译器,不使用javac
。
javac 1.8.0_45
在我的机器上没有问题,而 Eclipse Mars 显示了您所描述的错误。