2017-04-24 14 views
6

anlaması edilemez: Ben sınıfını başlatır bir fabrika (Sicil DP) sahip fonksiyonel bir arayüz tipi 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 

Ve içinde

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

Ama fonksiyonel arayüz türünü tahmin edemez almaya devam Hata. Burada ne yapıyorum?

+0

sizin lambda atar ve her dalda dönmez gerçeği may kafa karıştırıcı olmak. Bu nedenle kendi fonksiyonel arayüzümü yazmam gerektiğini hatırlıyorum. – Carcigenicate

cevap

7

Sizin defaultSupplier yöntem Class bir argüman türü vardır. Class'un beklenen bir lambda ifadesini geçemezsiniz. Ancak, yine de defaultSupplier numaralı yönteme ihtiyacınız yoktur.

Test yana

ve TestWithArgsValidation bir alt tipi vardır, lambda () -> new Test() ifadelerde ve () -> new TestWithArgs(2,4) o yönteme olmadan Supplier<Validation> zaten atanabilir:

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