为了账号安全,请及时绑定邮箱和手机立即绑定

用函数替换函数接口

用函数替换函数接口

胡说叔叔 2022-05-25 16:09:50
我对这段代码有点困惑。为什么不编译?@FunctionalInterfacepublic 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  }}
查看完整描述

3 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

查看包 java.util.function 的描述

函数式接口为 lambda 表达式和方法引用提供目标类型。

这并不意味着功能接口是任意具体类的变量的目标类型(例如Function<BigDecimal, BigDecimal>在您的情况下)。

要在需要特定功能接口()的上下文中使用Function<>(在您的情况下,在名为 的变量中),您可以简单地将其设为 lambda 或方法引用:funcInter

Inter i2 = p -> func.apply(p);  // compiles

或者

Inter i2 = func::apply;


查看完整回答
反对 回复 2022-05-25
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

我可以在这里看到 2 个功能接口(SAM),第一个是 Inter,第二个是由 java 提供的 FunctionalInterface,它表示一个接受一个参数并产生结果的函数。


查看Inter i2 = func;line ,您在这里尝试做的是将一个功能接口分配给另一个功能接口,这在这里没有任何意义。


我已经修改了您的代码并引入了一个新的功能界面,希望这有助于并消除您的疑问。


@FunctionalInterface

public interface Inter {

    BigDecimal method (BigDecimal param);

}


public static void main(String args[])

{

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


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


    //creating new functional interface which returns Inter lambda body.

    Supplier<Inter> interSuppFuncInter = () -> { return param -> BigDecimal.ZERO; };


    Inter i2 = interSuppFuncInter.get(); // now compile's

    System.out.println(i2.method(BigDecimal.ZERO)); // invoke i2 lambda by calling its  method and passing the param

}


查看完整回答
反对 回复 2022-05-25
?
Helenr

TA贡献1780条经验 获得超4个赞

func是一个Function<BigDecimal, BigDecimal>,它不是 的子接口Inter。因此,它不能分配给Inter变量。

两者InterFunction<BigDecimal, BigDecimal>都是具有相同签名的方法的功能接口这一事实并不重要,因为它们不相关。


查看完整回答
反对 回复 2022-05-25
  • 3 回答
  • 0 关注
  • 70 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信