我在下面给定的代码上得到了一个模糊的行为:
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字符串::toUpperCase和没有主::myFunctionSusNoArgs即使toUpperCase()是一个方法没有args相同的myFunctionSusNoArgs()
如果你把它写成lambda,可能会更有意义:
labo(t -> t.toUpperCase())
String::toUpperCase
等价于-
这里的“参数”是方法的接收器,即转换为大写的字符串。
我们在代码库中有一个处理程序类的层次结构,它们实现了一种责任链原则。有一个抽象父类,它由几个子类扩展,这些子类也在其构造函数中接收抽象 我们现在需要将具体子类之一的实例注入到新实现的服务类中,我们应该用XML来配置它。我们可以为抽象父类配置一个抽象bean,但这个bean似乎不被允许用作具体子bean的构造函数-arg 有什么办法可以克服这一点吗?处理程序类层次结构是遗留代码,我们现在无法修改它们
但是,我犯了一个错误,写了这样一段话: 然后我写道: 没有打印任何输出,所以我的问题是,基本上,为什么?
箭头函数: 正规函数 这两个结果应该是相同的,但是看起来像上面定义的arrowFunc考虑第一个arg列表,而normalFunc考虑第二组arg列表。
如果我不使用' a '和' b '变量,一切正常,否则,C返回: 错误:无法转换“main()::” 注意:初始化'void f(int, void(*)(int))'的参数2
我做了这个例子。 我试图模糊背景图像,但主要内容也模糊了(
假设我们有我的代码的简化版本: 我试图将lambda函数作为参数传递给函数,但只有当我将lambda显式分配给特定的类型时,它才起作用。这是可行的: 上面的例子是可行的,但我想实现下面的例子,因为审美的原因,不知道这是否可能: 我唯一的要求是应该接受带有模板化返回类型的lambda和函数,以及带有特定类型的输入参数,例如。