【问题标题】:Java compilation fail with method reference but works with lambdaJava 编译因方法引用而失败,但适用于 lambda
【发布时间】: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 Oxygenjavac 9;但确实失败了javac 8
  • A Collector 不会变成可序列化的,只是因为您让可序列化的 Supplier 返回它。恐怕,你会浪费很多时间去尝试一些会让你一事无成的事情……

标签: java generics java-8 method-reference


【解决方案1】:

这是javac 8 中的一个错误,因为它与javac-9(最新版本)编译得很好 - 我只是找不到它,我真的很努力。 p>

几乎像往常一样添加更多类型信息来修复此类问题...另请注意,我已将您的 Comparator 更改为 Comparator.comparingInt...

 return entrySet.stream().sorted(
            Comparator.comparingInt(Entry::getKey)).collect(
                    Collectors::<Map.Entry<Integer, String>> toList); 

【讨论】:

  • 哦,我没有意识到您在方法引用中添加了更多类型信息。这行得通! :)
猜你喜欢
  • 1970-01-01
  • 2019-09-19
  • 2019-04-09
  • 1970-01-01
  • 2018-03-26
  • 2020-08-21
  • 2017-06-27
  • 2021-03-06
  • 1970-01-01
相关资源
最近更新 更多