IntFunction <String>和Function <Integer,String>

Tom*_*Tom 5 java java-8 method-reference

我有两个简单的代码:

IntFunction<String> f1 = Integer::toString;
Function<Integer, String> f2 = Integer::toString;
Run Code Online (Sandbox Code Playgroud)

我认为这两个定义都是正确的,并且等价相同,但第二个定义了编译错误,抱怨说 Required Function<Integer, String>,but Method Reference is found.

Era*_*ran 6

第二种方法参考是模糊的:

这两种static方法

public static String toString(int i)
Run Code Online (Sandbox Code Playgroud)

和实例方法

public String toString()
Run Code Online (Sandbox Code Playgroud)

适用.

如果使用lambda表达式编写第二个赋值,可以看到有两种方法可以使用:

Function<Integer, String> f2 = i -> Integer.toString (i);
Run Code Online (Sandbox Code Playgroud)

要么

Function<Integer, String> f2 = i -> i.toString ();
Run Code Online (Sandbox Code Playgroud)

分配时Integer::toString,编译器无法决定您指的是哪种方法.

另一方面,在适用的情况下IntFunction<String>,仅public static String toString(int i)适用.

  • 或者``Function <Integer,String> f2 = String :: valueOf;`调用一个等效的`static`方法或`Function <Integer,String> f2 = Object :: toString;`得到相当于`i - > i的ToString()`... (2认同)