2015-09-26 11 views
11

Java 8's :: consente il riferimento al metodo tramite il solo nome del metodo.Parametri mancanti di Java 8 quando si utilizza ::

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

    loader.setControllerFactory(context::getBean); 

    return loader.getController(); 
} 

Ma, tuttavia, secondo BeanFactory Interface (Spring) getBean()getBean non prende parametri vuoti - sono previsti alcuni valori dei parametri:

getBean (String name) (String name, Class requiredType)
getBean
getBean (Nome stringa, Oggetto [] args)

Come è stato risolto?

risposta

15

Il metodo FXMLLoader di JavaFX setControllerFactory utilizza come parametro un Callback.

Questa è un'interfaccia funzionale il cui unico metodo è call prendere un parametro e restituire un risultato. In questo caso, il tipo di argomento è Callback<Class<?>, Object>. Quindi l'espressione lambda si aspetta un argomento di tipo Class<?>.

Quindi, in realtà, nessuno dei metodi citati sarà chiamato. Quello che verrà chiamato è getBean(Class<T> requiredType) (questo metodo esiste solo dalla primavera 3.0, quindi non lo vedrete nel riferimento 2.5.4 collegato).

È possibile riscrivere l'espressione metodo come questo per rendere questo più chiaro:

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

Qui, c avrà il tipo Class<?> a causa del parametro dichiarato di setControllerFactory.

Come nota a margine, tutto sarà compilare perché setControllerFactory si aspetta il risultato della richiamata per essere di tipo Object in modo che il risultato di context.getBean(c) corrisponde sempre.

Problemi correlati