[英]Replace functional interface with Function
我對這段代碼有點困惑。 為什么不編譯?
@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
}
}
查看包 java.util.function description 。
函數式接口為 lambda 表達式和方法引用提供目標類型。
這並不意味着函數接口是任意具體類變量的目標類型(例如Function<BigDecimal, BigDecimal>
在您的情況下)。
要在需要特定功能接口( Inter
)的上下文中使用Function<>
(在您的情況下,在名為func
的變量中),您可以簡單地將其設為 lambda 或方法引用:
Inter i2 = p -> func.apply(p); // compiles
或者
Inter i2 = func::apply;
我可以在這里看到 2 個功能接口(SAM),第一個是 Inter,第二個是 FunctionalInterface,它由 java 提供,它代表一個接受一個參數並產生結果的函數。
看着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
}
func
是一個Function<BigDecimal, BigDecimal>
,它不是Inter
的子接口。 因此它不能分配給Inter
變量。
Inter
和Function<BigDecimal, BigDecimal>
都是具有相同簽名方法的函數式接口這一事實並不重要,因為它們不相關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.