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 … (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |