2017-04-24 6 views
6

을 추론 할 수 없습니다 내가 클래스를 초기화 공장 (레지스트리 DP)가 기능 인터페이스 유형 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 

와의

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

하지만 기능적인 인터페이스 유형을 추론 할 수 없습니다가 계속 오류. 내가 여기서 뭘 잘못하고 있니?

+0

당신의 람다가 발생하고 모든 지점에 반환하지 않는 사실 수도 그것을 혼란스럽게하십시오. 이런 이유로 내 자신의 기능적 인터페이스를 작성해야한다는 것을 기억하는 것 같습니다. – Carcigenicate

답변

7

defaultSupplier 메서드의 인수 형식은 Class입니다. Class이 필요한 경우 람다 식을 전달할 수 없습니다. 그러나 그 방법은 필요하지 않습니다. defaultSupplier 어쨌든.

Test 이후

TestWithArgsValidation의 서브 타입이며, 람다는 () -> new Test() 표현과 () -> new TestWithArgs(2,4)는 방법없이 Supplier<Validation>에 이미 할당 할 수 있습니다 :

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