首页 > 解决方案 > 函数 ref 作为 arg 的行为不明确

问题描述

我在下面的给定代码上有一个模棱两可的行为:

public class Main {

    public static void main(String[] args) {

        labo(Main::myFunction);
        labo(Main::myFunctionWithNoArgs);//Compiletime exception!!!
        labo(String::toUpperCase);//Compiled line!!!
    }

    public static void labo(Function<String,String> function){
        System.out.println(function.apply("test"));
    }

    public static String myFunction(String arg){
        return arg;
    }

    public static String myFunctionWithNoArgs(){
        return "";
    }
}

我的问题是:我不明白为什么我没有得到 arg String::toUpperCase 的编译时异常,而 Main::myFunctionWithNoArgs 没有,即使 toUpperCase() 是一个没有 args 的方法,与 myFunctionWithNoArgs()

标签: javajava-8

解决方案


String::toUpperCase在这种情况下等价s -> s.toUpperCase()于,即它是一个函数 from Stringto String

这里的“参数”是方法的接收者,即String转换为大写的投注。


推荐阅读