12

What am I missing? Why do I have to use Object::toString below and not Integer::toString? Does it have anything to do with type erasure with 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
4

1 回答 1

23

这与类型擦除无关。

查看错误信息:

(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参数的静态方法,另toString()一种是覆盖Object's的方法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);
于 2015-01-11T08:04:48.210 回答