Подтвердить что ты не робот

Отсутствие параметров 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 (Spring) getBean() getBean не принимает пустые параметры - Некоторые параметры значения ожидаются:

getBean (имя строки)
getBean (имя строки, класс requiredType)
getBean (имя строки, объект [] args)

Как это разрешено?

4b9b3361

Ответ 1

Метод JavaFX FXMLLoader setControllerFactory принимает Callback в качестве параметра.

Это функциональный интерфейс, единственным методом которого является call, принимающий один параметр и возвращающий один результат. В этом случае тип аргумента Callback<Class<?>, Object>. Таким образом, выражение лямбда ожидает аргумент типа 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) всегда будет соответствовать.