用函数替换函数接口

我对这段代码有点困惑。为什么不编译?


@FunctionalInterface

public interface Inter {

  BigDecimal method (BigDecimal param);

}


public class Main {

  public static void main {

    Function<BigDecimal, BigDecimal> func = param -> BigDecimal.ZERO;

    Inter i1 = param -> BigDecimal.ZERO; // compile

    Inter i2 = func; // not compile

  }

}


胡说叔叔
浏览 71回答 3
3回答

慕姐8265434

查看包 java.util.function 的描述。函数式接口为 lambda 表达式和方法引用提供目标类型。这并不意味着功能接口是任意具体类的变量的目标类型(例如Function<BigDecimal, BigDecimal>在您的情况下)。要在需要特定功能接口()的上下文中使用Function<>(在您的情况下,在名为 的变量中),您可以简单地将其设为 lambda 或方法引用:funcInterInter&nbsp;i2&nbsp;=&nbsp;p&nbsp;->&nbsp;func.apply(p);&nbsp;&nbsp;//&nbsp;compiles或者Inter&nbsp;i2&nbsp;=&nbsp;func::apply;

杨__羊羊

我可以在这里看到 2 个功能接口(SAM),第一个是 Inter,第二个是由 java 提供的 FunctionalInterface,它表示一个接受一个参数并产生结果的函数。查看Inter i2 = func;line ,您在这里尝试做的是将一个功能接口分配给另一个功能接口,这在这里没有任何意义。我已经修改了您的代码并引入了一个新的功能界面,希望这有助于并消除您的疑问。@FunctionalInterfacepublic interface Inter {&nbsp; &nbsp; BigDecimal method (BigDecimal param);}public static void main(String args[]){&nbsp; &nbsp; Function<BigDecimal, BigDecimal> func = param -> BigDecimal.ZERO;&nbsp; &nbsp; Inter i1 = param -> BigDecimal.ZERO; // compile&nbsp; &nbsp; //creating new functional interface which returns Inter lambda body.&nbsp; &nbsp; Supplier<Inter> interSuppFuncInter = () -> { return param -> BigDecimal.ZERO; };&nbsp; &nbsp; Inter i2 = interSuppFuncInter.get(); // now compile's&nbsp; &nbsp; System.out.println(i2.method(BigDecimal.ZERO)); // invoke i2 lambda by calling its&nbsp; method and passing the param}

Helenr

func是一个Function<BigDecimal, BigDecimal>,它不是 的子接口Inter。因此,它不能分配给Inter变量。两者Inter和Function<BigDecimal, BigDecimal>都是具有相同签名的方法的功能接口这一事实并不重要,因为它们不相关。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java