【问题标题】:Invoking toString via method reference in Java 8在 Java 8 中通过方法引用调用 toString
【发布时间】:2015-01-12 00:26:31
【问题描述】:

我错过了什么?为什么我必须在下面使用Object::toString 而不是Integer::toString?它与泛型的类型擦除有什么关系吗?

Arrays.asList(1,2,3).stream().map(Integer::toString).forEach(System.out::println); //Won't compile

Arrays.asList(1,2,3).stream().map(Object::toString).forEach(System.out::println); //Compiles and runs fine

【问题讨论】:

标签: java java-8 method-reference


【解决方案1】:

这与类型擦除无关。

查看错误信息:

(argument mismatch; invalid method reference
  reference to toString is ambiguous
    both method toString(int) in Integer and method toString() in Integer match)

Integer 类有两个toString 方法,它们与map() 方法所期望的功能接口相匹配。一种是带有int 参数的静态方法,另一种是覆盖ObjecttoString()toString() 方法。

编译器不知道你是否要执行这个:

Arrays.asList(1,2,3).stream().map(i->Integer.toString(i)).forEach(System.out::println);

或者这个:

Arrays.asList(1,2,3).stream().map(i->i.toString()).forEach(System.out::println);

【讨论】:

  • 加一,覆盖得很好。
  • 您可以使用IntStream.of(1, 2, 3).mapToObj(Integer::toString) .forEach(System.out::println);,正如here所解释的那样,它并不模棱两可。
  • 我收到了不同的错误消息(也许是为什么我无法理解发生了什么)。我(在 IDE 中)收到的错误消息显示为“无法将 Stream 中的映射(java.util.function.Function)应用于()” .任何人都对此有何看法?
  • @sat 我不知道您为什么收到该错误消息。我尝试了您的代码here 并得到了答案中提到的错误。
  • @sat:如果您有一个特定于 IDE 的问题,您应该包括您使用的 IDE 的名称。
猜你喜欢
  • 2012-12-07
  • 2017-08-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 2022-10-13
  • 2017-10-01
相关资源
最近更新 更多