加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala的专业化是否构成?

发布时间:2020-12-16 18:15:20 所属栏目:安全 来源:网络整理
导读:我的印象是专业化组成,但在下面的例子中似乎并非如此: 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的
我的印象是专业化组成,但在下面的例子中似乎并非如此:

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

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

解决方法

您正在查看该类的非专业版本.

当我尝试时,我看到另一个类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
…

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读