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)
的结果将始终匹配。
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)
的结果将始终匹配。