2017-04-24 1 views
6

Ich habe eine Fabrik (Registry DP) ableiten, die die Klasse initialisiert:Kann nicht funktionalen Schnittstelle Typ 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 

Und in der Abstrakte

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); 
      } 
     }; 
    } 

Aber ich erhalte immer nicht funktionalen Schnittstelle Typen ableiten kann Error. Was mache ich hier falsch?

+0

Die Tatsache, dass Ihr Lambda wirft und kehrt nicht in jedem Zweig kann verwirre es. Ich erinnere mich, dass ich aus diesem Grund meine eigene funktionale Schnittstelle schreiben musste. – Carcigenicate

Antwort

7

Ihre defaultSupplier-Methode hat einen Argumenttyp von Class. Sie können einen Lambda-Ausdruck nicht übergeben, wenn Class erwartet wird. Aber Sie brauchen diese Methode defaultSupplier sowieso nicht.

Da Test und TestWithArgs sind Subtypen von Validation, Ausdrücke der Lambda-() -> new Test() und () -> new TestWithArgs(2,4) sind bereits zuordenbar Supplier<Validation> ohne diese Methode:

public class GenericFactory extends AbstractFactory { 
    public GenericPostProcessorFactory() { 
     factory.put("Test",() -> new Test()); 
     factory.put("TestWithArgs",() -> new TestWithArgs(2,4)); 
    }  
} 
Verwandte Themen