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

Invoking toString via method reference in Java 8

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

这与类型擦除无关。

查看错误信息:

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

Integer class 有两个 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);