我试图通过编写下面的代码来模仿java的Function:
接口SFunction {G应用( t);默认SFunction andThen(SFunction<?超级G?扩展Q>后){返回( T ) -> {返回after.apply(应用( t) );};//返回新的SFunction() { // @覆盖//公共Q应用(T){ //返回after.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));
}
};,但是为什么在snippet中,after.apply(apply(t))正在调用外部apply(T t),即使内部java实现了匿名实现。
片段A和B在内部和逻辑上不是相同的吗?
谢谢
发布于 2021-11-03 07:50:09
重要的是要注意代码片段B中的apply(t)实际上指的是什么方法:
@Override
public Q apply(T t) { // <--- it's referring to this method!
return after.apply(apply(t));
// ^^^^^^^^
}它实际上引用了apply(T)方法,该方法返回您刚才声明的Q。它试图用递归的方式来称呼它。但是很明显,这是行不通的,因为after.apply并不期望一个Q。Q apply(T)方法的声明G apply(T)方法在外部声明。
在lambda的例子中,没有引入名为apply的新标识符,因此apply只能表示SFunction<T, G>对象上的apply --在该对象上调用andThen的标识符。
要在SFunction<T, G>匿名类中引用SFunction<T, Q>对象的apply方法,可以使用限定的this表达式:
return after.apply(SFunction.this.apply(t));SFunction.this是指在其上调用andThen的SFunction<T, G>对象。
现在,这两个版本在逻辑上是相同的,但在内部,lambdas are very different from anonymous classes。
https://stackoverflow.com/questions/69821007
复制相似问题