我错过了什么?为什么我必须使用下面的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
答案 0 :(得分:17)
这与类型擦除无关。
查看错误消息:
(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
的{{1}}。
编译器不知道您是否要执行此操作:
toString()
或者这个:
Arrays.asList(1,2,3).stream().map(i->Integer.toString(i)).forEach(System.out::println);