scala - Scala 的专业是作曲吗?

标签 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

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

最佳答案

您正在查看该类(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/

相关文章:

java - Scala DynamicVariable 替代 ThreadLocal

list - 检查列表是否没有间隙的函数

scala - SBT Native Packager - 如何检索库依赖项并将其存储为包的一部分?

java - Scala 读取并解析 JSON

scala - 如何在scala中检查 map 是否包含空字符串值?

list - ":_*"在 Scala 中是什么意思? (使用列表过滤数据框时)

scala - scala 的 for-comprehensions 什么时候懒惰?

scala - 我如何用这个在 GraphX 中创建一个图形

scala - 实例化 'org.apache.spark.sql.hive.HiveSessionState'时出错:在Linux服务器上

scala - 使用 ScalaTest 将附加参数传递给测试