【发布时间】:2016-06-08 18:07:58
【问题描述】:
当使用 lambda 表达式时,Java 实际上创建了一个匿名(非静态)类。非静态内部类总是包含对其封闭对象的引用。
当从另一个库调用此 lambda 表达式时,该库可能在另一个进程中调用 lambda,调用崩溃并出现类未找到异常,因为它无法在另一个进程中找到封闭对象的类。
考虑这个例子:
public class MyClass {
public void doSomething() {
remoteLambdaExecutor.executeLambda(value -> value.equals("test"));
}
}
Java 会创建一个匿名内部类来实现某些功能接口,并将其作为参数传递给 executeLambda()。然后 remoteLambdaExecutor 将在整个过程中使用该匿名类以远程运行。 远程进程对 MyClass 一无所知,会抛出
java.lang.ClassNotFoundException: MyClass
因为该封闭对象引用需要 MyClass。
我总是可以使用 API 期望的功能接口的静态实现,但这违背了目的并且没有利用 lambda 功能。
有没有办法使用 lambda 表达式来解决它?
更新:我也不能使用静态类,除非它以某种方式导出到其他进程。
【问题讨论】:
-
may invoke lambda in a different process:听起来像一个交叉 -
也许 Java 是错误的语言。也许您需要一种脚本语言。