Java 8中使用::时缺少的参数

11

Java 8的::允许仅使用方法名称进行方法引用。

protected Object loadBeanController(String url) throws IOException {
    loader = new FXMLLoader(getClass().getResource(url));
    ApplicationContext context = MyProjectClass.getApplicationContext();

    loader.setControllerFactory(context::getBean);

    return loader.getController();
}

然而,根据 BeanFactory 接口(Spring)getBean()getBean 不接受空参数 - 需要一些参数值:

getBean(String name)
getBean(String name, Class requiredType)
getBean(String name, Object[] args)

如何解决这个问题?

1个回答

15

JavaFX的FXMLLoader方法setControllerFactory接受一个Callback作为参数。

这是一个功能接口,其唯一方法是call,它接受一个参数并返回一个结果。在此情况下,参数的类型为Callback<Class<?>, Object>。因此,Lambda表达式需要类型为Class<?>的参数。

实际上,你引用的任何方法都不会被调用。将调用getBean(Class<T> requiredType)(该方法仅存在于Spring 3.0之后的版本中,因此您在链接的2.5.4参考文档中看不到它)。

可以重写方法表达式以使其更清晰:

loader.setControllerFactory(c -> context.getBean(c));

在这里,由于setControllerFactory的声明参数,c的类型将是Class<?>

顺带一提,所有代码都可以编译通过,因为setControllerFactory期望回调的结果是Object类型,所以context.getBean(c)的结果始终匹配。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接