我正在努力理解Java的Consumer接口.我已经复制了它.但当我将andThen()方法的返回语句中的lambda表达式替换为匿名类定义时,它会引发StackOverflow Error:

interface Interface<T> {
       
    void accept(T t);

    default Interface<T> andThen(Interface<T> after) {

           //return (T t)->{accept(t); after.accept(t);};//this runs correctly
           
          //below is the anonymous class definition of above lambda expression
          return new Interface<T>(){

            @Override
            public void accept(T t)
            {
                accept(t); //stackoverflow error thrown
                after.accept(t);
            }
          };
     }
}

//Main class:

public class Lambda2 {

    public static void main(String args[]) {
        Interface<String> e1=str -> System.out.println("in e1 - "+str);
    
        Interface<String> e2=str -> System.out.println("in e2 - "+str);
        
        Interface<String> e3 = e1.andThen(e2);
        
        e3.accept("Sample Output");
    }
}

您能告诉我为什么匿名类定义的lambda表达式不会导致StackOverflow Error吗?

推荐答案

你可以在JLS 15.27.2中找到原因(我强调):

与出现在匿名类声明中的代码不同,the meaning of namesthissuper关键字appearing in a lambda body以及引用声明的可访问性are the same as in the surrounding context(除了lambda参数引入新名称之外).

也就是说,lambda主体内部的名称accept与lambda主体外部的accept具有相同的含义;不同之处在于显式地调用了一个匿名类.

因此:在定义了andThen方法主体的lambda中调用accept将涉及实例上的accept方法(就像您直接在方法主体中调用accept一样);而在匿名类中的accept方法主体中调用accept将递归地调用自身.

Java相关问答推荐

当我用OkHttpClient重写shouldInterceptRequest来发布数据时,Android WebView正在以纯HTML加载URL内容

在Java中将Charsequence数组更改为String数组或List String<>

即使我正在使用并发方法,使用Javascript的应用程序也会继续冻结'

Exe4j创建的应用程序无法再固定在任务栏Windows 11上

存根基类的受保护方法

如何从JNI方法正确调用NSOpenPanel以在正确的线程上运行?

Spring Boot&;Docker:无法执行目标org.springframework.boot:spring-boot-maven-plugin:3.2.0:build-image

如何在Spring Boot中创建可以将值传递给配置的&Enable&Quot;注释?

错误:未找到扩展元素在JBossEAP 7.2中安装FUSE时出错

视图被推出线性布局-Android

在整数列表中查找和可被第三个整数整除的对时出现无法解释的RunTimeError

本机方法(JNI)总是编译的吗?

如何使用jooq更新记录?

在ECLIPSE上的M1 Pro上运行JavaFX的问题

使用@ExceptionHandler的GlobalExceptionHandler还是来自服务器的REST应答的ResponseEntity?

原始和参数化之间的差异调用orElseGet时可选(供应商)

从 Java 17 切换回 Java 8 后出现的问题

如何在 WebSphere Application Server 内的托管线程上运行 BatchEE 作业(job)?

Vaadin Flow:设置密码显示按钮属性

Java-Apache BufferedHttpEntity 在发送请求时加载整个文件