Lambda反序列化-Lambda表达式是否总是对Scala的静态方法无效?

问题描述

我注意到,虽然Java的捕获lambda表达式的实例被转换为私有实例方法,但Scala的实例被转换为以包含类作为第一个参数的公共静态方法。 基本上,经过简化的lambda表达式如下所示:

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

Scala lambda表达式是否总是这种情况?如果没有,在什么情况下它们将成为实例方法

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

解决方法

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

Scala的lambdas早于Java的lambdas,这解释了为什么实现方式不同:

Scala可能会尝试复制Java所做的事情,除了在编写scala时,Java还没有它们。

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

从实用上讲,静态方法和私有实例方法在类级别上的区别很小。基本上无关紧要的细节(在类文件级别上,静态方法和实例方法之间的唯一真正区别是,一旦您确定静态方法将第一个参数作为接收者的替代参数,它就是动态的)派遣-从概念上讲,这不是私有方法所从事的事情,因此,没有真正的区别:它们都将“接收者”作为第一个参数。