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

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

相关文章:

python - 我可以在内存中 pickle Python 对象而不是物理文件吗?

java - 在Maven中,如何知道要从导入命令添加的依赖项

scala - 如何在模式匹配的右侧考虑枚举的所有情况

java - 为什么这个使用泛型的 HashMap 声明是错误的?

php - jquery .serialize() 后如何处理 php

eclipse - 使用 Eclipse 和 Tomcat 开发 Scala/Lift Web 应用程序

java - 将标准转换为自联接的分离标准

java - 减轻 Maven pom.xml 文件的冗长(或 : a critique of Maven by a fan)

java - 从 HttpPost Android 中提取 URL

scala - 终止 Actor 和 ActorSystem 后应用程序未退出