我試圖通過撰寫以下代碼來模仿 java 的 Function<T,R> :
interface SFunction<T, G> { G apply(T t); default <Q> SFunction<T, Q> andThen(SFunction<? super G, ? extends Q> after) { return (T t) -> { return after.apply(apply(t)); }; // return new SFunction<T, Q>() { // @Override // public Q apply(T t) { // return after.apply(apply(t)); // } // }; } }
當我在下面撰寫代碼時andThen,它作業正常(指向apply(T t)介面)并完美地鏈接其他功能實作
snippet A return (T t) -> {
return after.apply(apply(t));
};
但是當寫在代碼段下面時,它陷入了遞回,從邏輯上講這是正確的
snippet B return new SFunction<T, Q>() {
@Override
public Q apply(T t) {
return after.apply(apply(t));
}
};
,但為什么在片段 A 中,即使內部 java 實作匿名實作,after.apply(apply(t))也會呼叫外部apply(T t)。
片段 A 和 B 在內部和邏輯上是否相同?
謝謝
uj5u.com熱心網友回復:
重要的是要注意apply(t)代碼段 B 中實際指的是什么方法:
@Override
public Q apply(T t) { // <--- it's referring to this method!
return after.apply(apply(t));
// ^^^^^^^^
}
它實際上是指apply(T)回傳Q您剛剛宣告的a的方法。它試圖遞回呼叫它。但顯然這不起作用,因為after.apply不期望Q. 該宣告Q apply(T)方法陰影的G apply(T)方法對外宣稱。
在 lambda 的情況下,您不會引入名為 的新識別符號apply,因此apply只能表示物件apply上的SFunction<T, G>-andThen被呼叫的物件。
要在匿名類中參考SFunction<T, G>物件的apply方法SFunction<T, Q>,可以使用限定this運算式:
return after.apply(SFunction.this.apply(t));
SFunction.this指的是被呼叫的SFunction<T, G>物件andThen。
現在這兩個版本在邏輯上是一樣的,但在內部,lambdas 與匿名類有很大不同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/346359.html
上一篇:testEntityManager.persistFlushFind()給出錯誤“分離的物體傳遞給持久化”
下一篇:生成大于和小于的字串
