【问题标题】:Cannot infer functional interface type Java 8无法推断功能接口类型 Java 8
【发布时间】:2017-09-21 18:17:29
【问题描述】:

我有一个初始化类的工厂(Registry 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);
            }
        };
    }

但我不断收到无法推断功能接口类型错误。我在这里做错了什么?

【问题讨论】:

  • 您的 lambda 抛出并且不会在每个分支中返回的事实可能会混淆它。我似乎记得因为这个原因不得不编写自己的功能界面。

标签: java lambda java-8 registry


【解决方案1】:

您的defaultSupplier 方法的参数类型为Class。您不能在需要 Class 的地方传递 lambda 表达式。但无论如何你都不需要那个方法defaultSupplier

由于 TestTestWithArgsValidation 的子类型,因此 lambda 表达式 () -&gt; new Test()() -&gt; new TestWithArgs(2,4) 已经可以在没有该方法的情况下分配给 Supplier&lt;Validation&gt;

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

【讨论】:

  • 这实际上不是一个“答案”。这是一种“解决方法”。
  • 这里 TC 他有一个非常简单的案例 - 他只需要创建新对象(new Test() 和 new TestWithArgs(...))。但是,当有大量操作时,请考虑更复杂的情况 - 在这种情况下您不能使用此解决方法。
  • 绿色复选标记表示 OP 同意这解决了他们的问题。三年多之后,毫无疑问。除此之外,你的反对毫无意义。 Class.newInstance 没有什么是 lambda 表达式做不到的。其实lambda表达式可以包含任意Java代码,包括任意方法的调用,可以封装任意复杂度的操作,所以没有什么场景不能用这个方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
  • 2013-11-25
相关资源
最近更新 更多