![]() |
1
65
我不是专家,但我的理解是: 特性被编译成一个接口和相应的类。
相当于…
剩下的问题是:如何调用foo$class中的静态bar方法?这种魔力是由混合了foo特性的类中的编译器完成的。
变成…
类线性化只是根据语言规范中定义的线性化规则实现方法的适当版本(调用XXXX$class类中的静态方法)。 |
![]() |
2
5
为了便于讨论,让我们看看下面的scala示例,它使用抽象和具体方法的多个特性:
目前(即从scala 2.11开始),单个特征编码为:
这种编码的主要优点是没有具体成员(与接口同构)的特性实际上 是 编译到接口。
然而,斯卡拉2.12需要Java 8,因此能够在接口中使用默认方法和静态方法,结果看起来更像这样:
如您所见,带有静态方法和转发器的旧设计已经保留,它们只是折叠到接口中。特性的具体方法现在已经作为
可以这样简化:
我不知道为什么不这样做。乍一看,当前的编码可能会给我们带来一些前向兼容性:您可以使用用新编译器编译的特性和用旧编译器编译的类,这些旧类只会覆盖
|
![]() |
3
1
对此的一个很好的解释是: The busy Java developer's guide to Scala: Of traits and behaviors - Traits in the JVM 报价:
|
![]() |
4
0
在Scala 12和Java 8的上下文中,您可以看到另一个解释。 commit 8020cd6 以下内容:
|
![]() |
Lukas Eder · 如何使用调试日志信息动态生成堆栈帧 8 年前 |
![]() |
Valentin Lorentz · Python 3字节码格式 9 年前 |
![]() |
batman · Java中何时执行二进制运算符? 9 年前 |