有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

函数ref作为arg的java不明确行为

我在下面给定的代码上得到了一个不明确的行为:

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的compiletime异常和Main::myFunctionWithNoArgs的否异常,即使toUpperCase()是一个没有args的方法,与myFunctionWithNoArgs()相同


共 (2) 个答案

  1. # 1 楼答案

    String::toUpperCase在此上下文中相当于s -> s.toUpperCase(),即它是从StringString的函数

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

  2. # 2 楼答案

    如果你把它写成lambda,可能会更有意义:

    labo(t -> t.toUpperCase())