首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试图模仿java函数接口

试图模仿java函数接口
EN

Stack Overflow用户
提问于 2021-11-03 07:24:05
回答 1查看 67关注 0票数 2

我试图通过编写下面的代码来模仿java的Function:

接口SFunction {G应用( t);默认SFunction andThen(SFunction<?超级G?扩展Q>后){返回( T ) -> {返回after.apply(应用( t) );};//返回新的SFunction() { // @覆盖//公共Q应用(T){ //返回after.apply(应用(T);// }/ };}}

当我用andThen编写下面的代码时,它很好地工作(指向接口的apply(T t) ),并且完美地链接了其他功能实现

代码语言:javascript
复制
snippet A return (T t) -> {
    return after.apply(apply(t));     
};

但是当在代码段下面写时,它会陷入递归,从逻辑上讲,这是正确的

代码语言:javascript
复制
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在内部和逻辑上不是相同的吗?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-03 07:50:09

重要的是要注意代码片段B中的apply(t)实际上指的是什么方法:

代码语言:javascript
复制
@Override
public Q apply(T t) { // <--- it's referring to this method!
    return after.apply(apply(t));
//                     ^^^^^^^^
}

它实际上引用了apply(T)方法,该方法返回您刚才声明的Q。它试图用递归的方式来称呼它。但是很明显,这是行不通的,因为after.apply并不期望一个QQ apply(T)方法的声明G apply(T)方法在外部声明。

在lambda的例子中,没有引入名为apply的新标识符,因此apply只能表示SFunction<T, G>对象上的apply --在该对象上调用andThen的标识符。

要在SFunction<T, G>匿名类中引用SFunction<T, Q>对象的apply方法,可以使用限定的this表达式:

代码语言:javascript
复制
return after.apply(SFunction.this.apply(t));

SFunction.this是指在其上调用andThenSFunction<T, G>对象。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69821007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档