流中调用Executor Service遇编译错误的解决方案咨询(不修改Op)
解决"No enclosing instance of type IterativeExecutionTechniques is accessible"编译错误
这个错误的核心原因很清晰:你正在没有绑定外部类实例的上下文里尝试创建非静态内部类Op的对象。非静态内部类(未加static修饰的内部类)本质上依赖于外部类IterativeExecutionTechniques的实例——没有这个外部实例,JVM没法为内部类对象分配内存,因为内部类会隐式持有外部类实例的引用。
顺带说一句,这个错误和MyException是RuntimeException没有直接关联,只是刚好在ExecutorService的使用场景下,你的代码触发了内部类实例化的问题而已。
在不修改Op类任何内容的前提下,你可以通过以下两种场景对应的方式解决:
1. 如果在外部类的静态方法/静态代码块中调用
先显式创建外部类IterativeExecutionTechniques的实例,再通过这个实例来创建Op对象:
// 先实例化外部类 IterativeExecutionTechniques outerInstance = new IterativeExecutionTechniques(); // 用外部实例限定内部类的实例化 Op task = outerInstance.new Op(); // 再提交给ExecutorService executorService.submit(task);
2. 如果在外部类的非静态方法/另一个内部类中调用
可以直接用外部类名.this指定当前外部类的实例,以此创建Op对象:
// 明确使用当前外部类实例来创建内部类对象 Op task = IterativeExecutionTechniques.this.new Op(); executorService.submit(task);
简单来说:只要确保创建Op对象时,始终绑定一个有效的IterativeExecutionTechniques外部实例,这个编译错误就会消失。
内容的提问来源于stack exchange,提问作者John Eipe
相关产品推荐
相关产品推荐

