gpt4 book ai didi

spring - 为什么在 Scala 2.9.x 中编译为桥接方法而不是在 2.8.x 中的特征中的具体函数实现?

转载 作者:IT老高 更新时间:2023-10-28 13:47:14 25 4
gpt4 key购买 nike

在 Scala 2.9.0 之前的版本中,trait 中的具体函数实现被编译为普通方法。从 2.9.x 开始,它们被编译为桥接方法。我试图找出这种变化背后的原因,因为它对 Spring 和 Jersey 等许多流行 Java 框架的用户产生了负面影响。

考虑以下 Scala 代码:

trait Speaks {
def speak() = {
println("woof")
}
}

class Dog extends Speaks {
def wag() = {
println("wag wag")
}
}

当 Dog 类使用 scalac 版本 2.8.1 编译并使用 javap 反编译时,“speak”和“wag”函数的结果如下所示:

public void speak();
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokestatic #11 // Method Speaks$class.speak:(LSpeaks;)V
4: return
LineNumberTable:
line 7: 0

public void wag();
flags: ACC_PUBLIC
Code:
stack=2, locals=1, args_size=1
0: getstatic #18 // Field scala/Predef$.MODULE$:Lscala/Predef$;
3: ldc #20 // String wag wag
5: invokevirtual #24 // Method scala/Predef$.println:(Ljava/lang/Object;)V
8: return
LineNumberTable:
line 9: 0

当 Dog 用 scalac 版本 2.9.1 编译并再次反编译时,相同的两个函数如下所示:

public void speak();
flags: ACC_PUBLIC, ACC_BRIDGE
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokestatic #11 // Method Speaks$class.speak:(LSpeaks;)V
4: return
LineNumberTable:
line 7: 0

public void wag();
flags: ACC_PUBLIC
Code:
stack=2, locals=1, args_size=1
0: getstatic #18 // Field scala/Predef$.MODULE$:Lscala/Predef$;
3: ldc #20 // String wag wag
5: invokevirtual #24 // Method scala/Predef$.println:(Ljava/lang/Object;)V
8: return
LineNumberTable:
line 9: 0

有问题的部分是在 speak() 函数中添加了 ACC_BRIDGE 标志。在许多情况下,像 Jersey 和 Spring 这样的框架故意不将桥接方法识别为其他问题的解决方法。

那么任何人都可以解释或指出为什么在 Scala 2.9.x 中进行此更改的原因吗?

作为后续,有没有办法通过函数注释、编译器标志等来禁用此行为?

最佳答案

好吧,这听起来好像没有解释为什么,因为这不是故意的改变。看到这个线程: http://groups.google.com/group/scala-language/browse_thread/thread/67f8884081d46912

解决方案是使用最新的快照,或者,如果您阅读本文时 future 已经到来,那么使用 Scala 2.10

关于spring - 为什么在 Scala 2.9.x 中编译为桥接方法而不是在 2.8.x 中的特征中的具体函数实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8748625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com