函数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()相同
# 1 楼答案
String::toUpperCase
在此上下文中相当于s -> s.toUpperCase()
,即它是从String
到String
的函数这里的“参数”是方法的接收者,即转换为大写的
String
投注# 2 楼答案
如果你把它写成lambda,可能会更有意义: