试图模仿 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 不期望 QQ 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 指的是调用 andThenSFunction<T, G> 对象。

现在这两个版本在逻辑上是一样的,但是在内部,lambdas are very different from anonymous classes.