由於它只驗證給定的對象是否擴展了某個類或實現了一個接口 - 它不會改變對象本身,所以Casting「幾乎是微不足道的」。
在你的情況,如果func
代表lambda表達式或方法引用
executor.execute((Runnable & Serializable)() -> System.out.println("5"));
executor.execute((Runnable & Serializable) System.out::println);
的LambdaMetafactory保證生成的拉姆達對象真正實現Runnable
和Serializable
和演員甚至可能得到優化。
然而,如果func
是參數傳遞給方法:
public void execute(Runnable func) {
executor.execute((Runnable & Serializable)func);
}
無論是java編譯器,也不是Java運行時會莫名其妙地神奇地讓func
序列化了。
在這種情況下,可以重寫方法
public <T extends Runnable & Serializable> void execute(T func) {
executor.execute(func);
}
這就要求呼叫者提供一種可運行和序列化對象 - 無論是自動生成的一個(通過lambda表達式或方法引用)或「手動」編碼類。
僅當「func」是實際的lambda表達式或方法引用時,在這種情況下,根本不會有運行時類型轉換。就目前而言,如果'func'只是一個引用已經存在的函數的標識符,這是一個普通的類型轉換,它不會將該函數轉換爲可序列化的類型。 – Holger
@Holger謝謝你的提示。我試圖改進我的回答 –
請注意,在上例中,類型轉換是不必要的。 – Holger