2015-09-26 16 views
11

Java 8's :: umożliwia odwoływanie metod za pośrednictwem samej nazwy metody.Brakujące parametry języka Java 8 podczas korzystania z ::

protected Object loadBeanController(String url) throws IOException { 
    loader = new FXMLLoader(getClass().getResource(url)); 
    ApplicationContext context = MyProjectClass.getApplicationContext(); 

    loader.setControllerFactory(context::getBean); 

    return loader.getController(); 
} 

Ale jednak według BeanFactory Interface (Spring) getBean()getBean nie bierze pustych parametrów - oczekuje Niektóre wartości parametrów:

getBean (String name) (String name, klasa requiredType)
getBean
getBean (nazwa ciągu, Object [] args)

Jak to rozwiązano?

Odpowiedz

15

Metoda JavaFX FXMLLoader Metoda setControllerFactory przyjmuje jako parametr Callback.

Jest to funkcjonalny interfejs, którego jedynym sposobem jest call pobranie jednego parametru i zwrócenie jednego wyniku. W takim przypadku typ argumentu to Callback<Class<?>, Object>. Tak więc wyrażenie lambda oczekuje argumentu typu Class<?>.

Tak więc, żadna z wymienionych metod nie zostanie wywołana. To, co zostanie nazwane, to getBean(Class<T> requiredType) (ta metoda istnieje tylko od wersji Spring 3.0, więc nie będzie jej widać w odnośniku 2.5.4).

Jest możliwość przerobienia wyraz metody tak, aby to bardziej jasne:

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

Tutaj c będzie miał typ Class<?> ponieważ deklarowanej parametru setControllerFactory.

Na marginesie wszystko się skompiluje, ponieważ setControllerFactory oczekuje, że wynik wywołania zwrotnego będzie typu Object, więc wynik context.getBean(c) będzie zawsze zgodny.

Powiązane problemy