【发布时间】:2017-09-18 08:31:57
【问题描述】:
我们正在尝试将重载的 collect 方法添加到我们目前定义为的扩展 Java Stream API:
interface ExtendedStream<R> extends Stream<R> {
<R1> R1 collect(SerializableSupplier<Collector<? super R, ?, R1>> supplier);
}
SerializableSupplier 被定义为:
interface SerializableSupplier<T> extends Serializable, Supplier<T> {
}
使用 lambda 调用此 collect 方法可以正常工作,但使用方法引用调用它无法编译,并出现以下错误:
Error:(50, 72) java: incompatible types: cannot infer type-variable(s) R1,capture#1 of ?,T
(argument mismatch; bad return type in method reference
java.util.stream.Collector<T,capture#1 of ?,java.util.List<T>> cannot be converted to java.util.stream.Collector<? super java.util.Map.Entry<java.lang.Integer,java.lang.String>,?,R1>)
我创建了一个独立的 Java 类 here,您可以将其加载到编译器中进行试用。
我目前使用的是 Java 版本:
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
这是我们定义事物的错误还是一些错误?
注意:我在 IntelliJ 和使用 Maven 编译时都收到此编译错误。我不使用 Eclipse。
干杯, 高德
【问题讨论】:
-
您应该在问题中直接包含所有相关代码。
-
可以完全独立运行的代码大约有 400 行。您是要粘贴 400 行吗?听起来不是个好主意:\
-
如果需要整整 400 行才能找到问题,那么是的,这就是你应该做的。但是,您更有可能发布更短的代码来显示您的问题 - 有效的 lambda 表达式和无效的方法引用。
-
1) 我不知道你添加了评论,除非你用
@注释我,比如@Eugene... 2) 完全是我的坏 - 它适用于Eclipse Oxygen和javac 9;但确实失败了javac 8 -
A
Collector不会变成可序列化的,只是因为您让可序列化的Supplier返回它。恐怕,你会浪费很多时间去尝试一些会让你一事无成的事情……
标签: java generics java-8 method-reference