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

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

 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 

这与类型擦除无关。

查看错误消息:

 (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()方法所期望的function接口相匹配。 一个是带有int参数的static,另一个是覆盖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);