java - lambda 反序列化 - lambda 表达式是否总是脱糖为 Scala 的静态方法?

标签 java scala serialization lambda jvm

我注意到,虽然 Java 的实例捕获 lambda 表达式被转换为私有(private)实例方法,但 Scala 的实例方法被转换为公共(public)静态方法,该方法将包含类作为第一个参数。 基本上,脱糖的 lambda 表达式似乎如下所示:

public static final boolean $anonfun$getLambda$1(com.test.SomeClass):
   ...

Scala lambda 表达式总是这样吗?如果不是,在什么情况下它们将是实例方法?

此外,为什么 Scala lambda 表达式的工作方式与 Java lambda 表达式不同?

最佳答案

Java也可以创建静态方法;这取决于上下文。

Scala 的 lambda 早于 java,这解释了为什么实现不同:

Scala 可能会尝试复制 java 所做的事情,只不过,当编写 scala 时,java 还没有它们。

Java 没有兴趣复制 scala 所做的事情。此外,java 语言设计团队与涉及类文件格式和 JVM 本身的团队直接沟通,因此,如果语言实现创建了 VM 不能很好处理的场景,那么任何对性能的担忧都是无关紧要的,那么可以说可以在“内部”解决这个问题。这意味着 java 将以其他托管在 JVM 上的语言无法做到的方式设计其语言功能。

实际上,在类级别,静态方法和私有(private)实例方法之间几乎没有什么区别。一个基本上无关紧要的细节(类文件级别的静态方法和实例方法之间的唯一真正区别,一旦您假设静态方法将第一个参数作为接收者的替代参数,那么它就是动态的调度 - 作为一个概念,这不是私有(private)方法参与的事情,因此,没有真正的区别:它们都将“接收者”作为第一个参数)。

关于java - lambda 反序列化 - lambda 表达式是否总是脱糖为 Scala 的静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63405221/

相关文章:

c# - 无法将对象数组从 JSON 反序列化为 C# 对象

java - Hibernate架构迁移设置命名策略

java - 通过循环创建多个同名对象

java - 计算句子中重复单词的总数

java - 当我使用 Algebird 库时,如何使用 Java lambda 返回字节数组?

scala - 如何正确使用 Akka-TestKit TestProbe?

ruby-on-rails - 序列化哈希字段和简单表单

java - 如何使用接口(interface)使用 Kryo 序列化/反序列化对象

java - 需要动态规划解决方案

scala - 如何排除 Sbt 中的传递依赖(在程序集插件的上下文中)?