问题描述
我注意到,虽然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托管语言无法做到的方式设计其语言功能。
从实用上讲,静态方法和私有实例方法在类级别上的区别很小。基本上无关紧要的细节(在类文件级别上,静态方法和实例方法之间的唯一真正区别是,一旦您确定静态方法将第一个参数作为接收者的替代参数,它就是动态的)派遣-从概念上讲,这不是私有方法所从事的事情,因此,没有真正的区别:它们都将“接收者”作为第一个参数。