Java 8 在使用 :: 时缺少参数

Java 8's missing parameters when using ::

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 Interface (Spring) getBean() getBean 不采用空参数 - 一些参数值是预期的:

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

这个是怎么解决的?

JavaFX 的 FXMLLoader 方法 setControllerFactory takes a Callback 作为参数。

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

类型的参数

所以,实际上,none 你引用的方法将被调用。将调用的是 getBean(Class<T> requiredType)(此方法只存在于 Spring 3.0 之后,因此您不会在链接的 2.5.4 参考中看到它)。

可以像这样重写方法表达式以使其更清楚:

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

此处,c 将具有类型 Class<?>,因为声明的参数为 setControllerFactory

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