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

sat*_*sat 9 java java-8 method-reference

我错过了什么?为什么我必须在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
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 20

这与类型擦除无关.

查看错误消息:

(argument mismatch; invalid method reference
  reference to toString is ambiguous
    both method toString(int) in Integer and method toString() in Integer match)
Run Code Online (Sandbox Code Playgroud)

的Integer类有两个toString匹配由预期的功能的界面,方法map()方法.一个是静态的一个int参数,而另一种是toString()重写方法Object的toString().

编译器不知道您是否要执行此操作:

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

或这个 :

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

  • 您可以使用`IntStream.of(1,2,3).mapToObj(Integer :: toString).forEach(System.out :: println);`这里没有歧义,如[here]所述(http:// stackoverflow. COM /一个/二百七十一万一千四百八十八分之二千一百八十七万六千零七十七). (2认同)