2015-09-26 22 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つのパラメータを取り、1件の結果を返している機能のインタフェースです。この場合、引数の型はCallback<Class<?>, Object>です。したがって、ラムダ式では、型がClass<?>の引数が必要です。

Soは、実際に、あなたが引用した方法のどれも呼ばれません。呼び出されるのはgetBean(Class<T> requiredType)です(このメソッドはSpring 3.0以降にしか存在しないため、リンクされた2.5.4リファレンスには表示されません)。

より明確にするために、次のようにメソッド式を書き換えることが可能である:

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

cが原因setControllerFactoryの宣言されたパラメータの種類Class<?>を持つことになります。

setControllerFactoryは、コールバックの結果がObjectであると予想し、context.getBean(c)の結果が常に一致するため、すべてがコンパイルされます。

関連する問題