2015-09-26 28 views
11

Java 8's :: chỉ cho phép tham chiếu phương thức thông qua tên phương thức.Tham số bị mất của Java 8 khi sử dụng ::

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

    loader.setControllerFactory(context::getBean); 

    return loader.getController(); 
} 

Nhưng, tuy nhiên, theo BeanFactory Interface (Spring) getBean()getBean không mất thông số trống - Một số giá trị tham số được mong đợi:

getBean (String name)
getBean (String name, Class requiredType)
getBean (Tên chuỗi, đối tượng [] args)

Cách này được giải quyết?

Trả lời

15

Phương thức FXMLLoader của JavaFX setControllerFactory lấy một tham số Callback làm tham số.

Đây là giao diện chức năng có phương pháp duy nhất là call lấy một tham số và trả về một kết quả. Trong trường hợp này, loại đối số là Callback<Class<?>, Object>. Vì vậy, biểu thức lambda mong đợi một đối số của loại Class<?>.

Vì vậy, trên thực tế, không có phương pháp nào bạn trích dẫn sẽ được gọi. Những gì sẽ được gọi là getBean(Class<T> requiredType) (phương pháp này chỉ tồn tại từ mùa xuân 3.0, do đó bạn sẽ không thấy nó trong tham chiếu 2.5.4 được liên kết của bạn).

Có thể viết lại biểu thức phương pháp như thế này để làm cho điều này rõ ràng hơn:

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

Ở đây, c sẽ có các loại Class<?> vì tham số tuyên bố của setControllerFactory.

Lưu ý phụ, mọi thứ sẽ biên dịch vì setControllerFactory mong đợi kết quả của cuộc gọi lại là loại Object do đó kết quả của context.getBean(c) sẽ luôn khớp.

Các vấn đề liên quan