无法推断函数接口类型Java 8

无法推断函数接口类型Java 8,java,lambda,java-8,registry,Java,Lambda,Java 8,Registry,我有一个初始化类的工厂(注册表DP): public class GenericFactory extends AbstractFactory { public GenericPostProcessorFactory() { factory.put("Test", defaultSupplier(() -> new Test())); factory.put("TestWithArgs",

我有一个初始化类的工厂(注册表DP):

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
在工厂里

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

protectedsupplier defaultSupplier(Class您的
defaultSupplier
方法的参数类型为
Class
。在需要
Class
的情况下,您不能传递lambda表达式。但无论如何,您都不需要该方法
defaultSupplier

由于
Test
TestWithArgs
Validation
的子类型,lambda表达式
()->new Test()
()->new TestWithArgs(2,4)
已经可以分配给
供应商
,而无需该方法:

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

您的lambda抛出并没有在每个分支中返回这一事实可能会让人感到困惑。我似乎记得出于这个原因必须编写自己的函数接口。这实际上不是一个“答案”。这是一个“解决办法”。在这里,他有一个非常简单的案例——他只需要创建新对象(new Test()和new TestWithArgs(…))但是考虑到有很多操作时更复杂的情况——在这种情况下,你不能使用这个解决方案。绿色的检查标志表明OP同意这解决了他们的问题。在三年后没有任何问题。除此之外,你的反对是没有意义的。没有什么是<代码>类。newInstance
可以做到lambda表达式所不能做到的。事实上,lambda表达式可以包含任意Java代码,包括对任意方法的调用,这些方法可以封装任意复杂度的操作,因此在任何情况下都可以使用此解决方案。