我对这段代码有些困惑。为什么不编译?
@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
}
}
答案 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)
func
是Function<BigDecimal, BigDecimal>
,不是Inter
的子接口。因此,无法将其分配给Inter
变量。
Inter
和Function<BigDecimal, BigDecimal>
都是具有相同签名方法的功能接口这一事实无关紧要,因为它们不相关。