我认为专业化的构成,但在下面的例子中似乎并非如此:
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
专业化对开发通用实现完全没用吗?就我而言,数据结构,它将完全破坏开发简洁模块化代码的努力。所以我希望我错过了一些东西......
答案 0 :(得分:5)
您正在查看该课程的非专业版本。
当我尝试时,我看到另一个类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
…