我的印象是特化组成,但在以下示例中似乎并非如此:
trait Key [@specialized(Int) A] {
def up(k: A): Unit
}
class Test[@specialized(Int) A](key: Key[A], value: A) {
key.up(value)
}
如果我用
:javap -v Test
将其转储到 Scala REPL 中,似乎对 key.up
的调用仍然装箱原语:public Test(Key, java.lang.Object);
Code:
Stack=2, Locals=3, Args_size=3
0: aload_0
1: aload_1
2: putfield #17; //Field key:LKey;
5: aload_0
6: aload_2
7: putfield #19; //Field value:Ljava/lang/Object;
10: aload_0
11: invokespecial #24; //Method java/lang/Object."<init>":()V
14: aload_0
15: getfield #17; //Field key:LKey;
18: aload_0
19: getfield #19; //Field value:Ljava/lang/Object;
22: invokeinterface #30, 2; //InterfaceMethod Key.up:(Ljava/lang/Object;)V
27: return
那么特化对于开发通用实现完全没用吗?就我而言,数据结构将完全破坏开发简洁模块化代码的努力。所以我希望我错过了一些东西......
最佳答案
您正在查看该类(class)的非专业版本。
当我尝试时,我看到另一个类(class) Test$mcI$sp
那是专门的编译版本。这是重点,它必须创建一个单独的类,专门用于您指定的原语。
编辑 : 如果在 REPL 中寻找专门的类,你需要得到完整的类名。默认情况下,REPL 会修剪存储类的实际上下文,因此您需要通过 println 获取它,例如:
scala> println(new Test(1).getClass.getName)
$line1.$read$$iw$$iw$Test$mcI$sp
scala> :javap $line1.$read$$iw$$iw$Test$mcI$sp
…
关于scala - Scala 的专业是作曲吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8043564/