2015-09-26 58 views
11

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 Interface (Spring) getBean()getBean不走空的參數 - 某些參數值預計:

的getBean(字符串名稱)
的getBean(字符串名稱,類requiredType)
getBean(String name,Object [] args)

這是如何解決的?

回答

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

這裏,c將有類型Class<?>因爲setControllerFactory聲明的參數。

作爲一個便箋,一切都會編譯,因爲setControllerFactory預計回調的結果是Object,因此context.getBean(c)的結果將始終匹配。