问题 使用::时Java 8缺少参数


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)

这是如何解决的?


9529
2017-09-26 12:04


起源



答案:


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));

这里, c 将有类型 Class<?> 因为声明的参数 setControllerFactory

作为旁注,一切都会编译,因为 setControllerFactory 期望回调的结果是类型 Object 所以结果 context.getBean(c) 永远匹配。


15
2017-09-26 12:11