Scala的专业化是否构成?

时间:2011-11-07 22:32:17

标签: scala

我认为专业化的构成,但在下面的例子中似乎并非如此:

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

专业化对开发通用实现完全没用吗?就我而言,数据结构,它将完全破坏开发简洁模块化代码的努力。所以我希望我错过了一些东西......

1 个答案:

答案 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
…
相关问题