在Java 8中通过方法引用调用toString方法

13
我错过了什么?为什么在下面要使用 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

2
顺便提一下,您可以直接编写 Arrays.asList(1,2,3).forEach(System.out::println);Stream.of(1,2,3).forEach(System.out::println);IntStream.rangeClosed(1, 3).forEach(System.out::println); - Peter Lawrey
1个回答

26

这与类型消除无关。

看一下错误信息:

(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);

1
加一,覆盖得好。 - Peter Lawrey
2
你可以使用 IntStream.of(1, 2, 3).mapToObj(Integer::toString) .forEach(System.out::println); 这段代码,这是不会产生歧义的,具体解释请参考这里 - Holger
我收到了一个不同的错误信息(也许这就是我无法理解发生了什么的原因)。我在IDE中得到的错误信息是:“Stream中的map(java.util.function.Function <? super java.lang.Integer,? extends R>)不能应用于(<method reference>)”。有人能理解这是什么意思吗? - sat
@sat 我不知道为什么你会收到那个错误信息。我在这里尝试了你的代码(http://www.compilejava.net/),并得到了我回答中提到的错误。 - Eran
@sat:如果你有关于特定IDE的问题,应该包括你使用的IDE名称。 - Holger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接