我正在阅读Java 8方法参考:如何使用它并想以其他方式重复使用三功能:
public class Numbers {
public static void main(String[] args) throws Exception {
TriFunction<Numbers, String, String, Integer> function = (s, arg1, arg2 ) -> Numbers.doSum(arg1, arg2);
System.out.println(function.apply(new Numbers(), "1", "2"));
//error, not warning: The method doSum(String, String) from the type Numbers should be accessed in a static way
TriFunction<Numbers, String, String, Integer> mRef = Numbers::doSum;
System.out.println(mRef.apply(new Numbers(), "3", "4"));
}
static Integer doSum(String s1, String s2) {
return Integer.parseInt(s1) + Integer.parseInt(s2);
}
}
interface TriFunction<T, U, V, R> {
R apply(T t, U u, V v);
}
我知道应该以静态方式访问静态方法。但是我认为我不会用Numbers::doSum
打破规则。那么原因是什么?
Numbers::doSum
,当应用于 TriFunction<Numbers, String, String, Integer>
时,将转换为 (n, s1, s2) -> n.doSum(s1, s2)
,这意味着您在Numbers
实例上调用静态方法。要么将其作为实例方法,要么使用不期望Numbers
实例的BiFunction
。
我现在知道原因。
TriFunction<Numbers, String, String, Integer> mRef = Numbers::doSum;
在这里, doSum()
应该取3个args,但实际上它只能从定义中取2个:
static Integer doSum(String s1, String s2) {}