2017-04-24 65 views
6

tôi có một nhà máy (Registry DP) mà khởi tạo các lớp:Không thể suy ra chức năng loại giao diện JAVA 8

public class GenericFactory extends AbstractFactory { 

    public GenericPostProcessorFactory() { 
     factory.put("Test", 
       defaultSupplier(() -> new Test())); 
     factory.put("TestWithArgs", 
       defaultSupplier(() -> new TestWithArgs(2,4))); 
    } 

} 

interface Validation 

Test implements Validation 
TestWithArgs implements Validation 

Và trong AbstractFactory

protected Supplier<Validation> defaultSupplier(Class<? extends Validation> validationClass) { 
     return() -> { 
      try { 
       return validationClass.newInstance(); 
      } catch (InstantiationException | IllegalAccessException e) { 
       throw new RuntimeException("Unable to create instance of " + validationClass, e); 
      } 
     }; 
    } 

Nhưng tôi tiếp tục nhận được không thể suy ra kiểu giao diện chức năng Lỗi. Những gì tôi đang làm sai ở đây?

+0

Thực tế là lambda của bạn ném và không trả lại trong mỗi chi nhánh có thể gây nhầm lẫn. Tôi dường như nhớ lại phải viết lên giao diện chức năng của riêng tôi vì lý do này. – Carcigenicate

Trả lời

7

Phương thức defaultSupplier của bạn có loại đối số là Class. Bạn không thể vượt qua biểu thức lambda khi dự kiến ​​sẽ có Class. Tuy nhiên, bạn không cần phương thức đó defaultSupplier.

Kể từ TestTestWithArgs là một phân nhóm của Validation, lambda biểu thức () -> new Test()() -> new TestWithArgs(2,4) đã chuyển nhượng để Supplier<Validation> mà không phương pháp đó:

public class GenericFactory extends AbstractFactory { 
    public GenericPostProcessorFactory() { 
     factory.put("Test",() -> new Test()); 
     factory.put("TestWithArgs",() -> new TestWithArgs(2,4)); 
    }  
} 
Các vấn đề liên quan