用功能替换功能接口

时间:2019-01-28 11:56:51

标签: java lambda

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

@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
  }
}

3 个答案:

答案 0 :(得分:2)

看看package java.util.function description

  

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

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

要在需要特定功能接口(Function<>)的上下文中使用func(在您的情况下,称为Inter的变量),只需将其设为lambda或方法参考:

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

Inter i2 = func::apply;

答案 1 :(得分:1)

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

Inter i2 = func;行中,您要在此处执行的操作是将一个功能接口分配给其他功能接口,这在这里没有任何意义。

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

@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
}

答案 2 :(得分:0)

funcFunction<BigDecimal, BigDecimal>,不是Inter的子接口。因此,无法将其分配给Inter变量。

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