提问者:小点点

通过Java8中的方法引用调用toString


我错过了什么?为什么我必须在下面使用对象::toString而不是整数::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

共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()方法。

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

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