为什么 eclipse 告诉我应该"accessed in a static way"静态方法引用 ClassName::staticMethod?



我正在阅读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) {}

最新更新