试图模仿 java 功能界面
Trying to mimic java functional interface
我正在尝试通过编写以下代码来模仿 java 的 Function :
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,就陷入了递归,逻辑上是对的
snippet B return new SFunction<T, Q>() {
@Override
public Q apply(T t) {
return after.apply(apply(t));
}
};
,但为什么在片段 A 中,after.apply(apply(t))
正在调用外部 apply(T t)
,即使在内部 java 实现了匿名实现。
片段 A 和片段 B 在内部和逻辑上不是相同的吗?
谢谢
重要的是要注意片段 B 中的 apply(t)
实际指的是什么方法:
@Override
public Q apply(T t) { // <--- it's referring to this method!
return after.apply(apply(t));
// ^^^^^^^^
}
实际上是指apply(T)
你刚刚声明的returns一个Q
方法。它试图递归地调用它。但显然那是行不通的,因为 after.apply
不期望 Q
。 Q apply(T)
方法的声明shadowsG apply(T)
方法外的声明。
在 lambda 的情况下,您没有引入一个名为 apply
的新标识符,因此 apply
只能表示 SFunction<T, G>
对象上的 apply
- 一个andThen
被调用。
要在SFunction<T, Q>
匿名class中引用SFunction<T, G>
对象的apply
方法,可以使用限定的this
表达式:
return after.apply(SFunction.this.apply(t));
SFunction.this
指的是调用 andThen
的 SFunction<T, G>
对象。
现在这两个版本在逻辑上是一样的,但是在内部,lambdas are very different from anonymous classes.
我正在尝试通过编写以下代码来模仿 java 的 Function
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,就陷入了递归,逻辑上是对的
snippet B return new SFunction<T, Q>() {
@Override
public Q apply(T t) {
return after.apply(apply(t));
}
};
,但为什么在片段 A 中,after.apply(apply(t))
正在调用外部 apply(T t)
,即使在内部 java 实现了匿名实现。
片段 A 和片段 B 在内部和逻辑上不是相同的吗?
谢谢
重要的是要注意片段 B 中的 apply(t)
实际指的是什么方法:
@Override
public Q apply(T t) { // <--- it's referring to this method!
return after.apply(apply(t));
// ^^^^^^^^
}
实际上是指apply(T)
你刚刚声明的returns一个Q
方法。它试图递归地调用它。但显然那是行不通的,因为 after.apply
不期望 Q
。 Q apply(T)
方法的声明shadowsG apply(T)
方法外的声明。
在 lambda 的情况下,您没有引入一个名为 apply
的新标识符,因此 apply
只能表示 SFunction<T, G>
对象上的 apply
- 一个andThen
被调用。
要在SFunction<T, Q>
匿名class中引用SFunction<T, G>
对象的apply
方法,可以使用限定的this
表达式:
return after.apply(SFunction.this.apply(t));
SFunction.this
指的是调用 andThen
的 SFunction<T, G>
对象。
现在这两个版本在逻辑上是一样的,但是在内部,lambdas are very different from anonymous classes.