Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 实现固定大小、不可变和专用的向量_Scala_Autoboxing_Specialized Annotation - Fatal编程技术网

Scala 实现固定大小、不可变和专用的向量

Scala 实现固定大小、不可变和专用的向量,scala,autoboxing,specialized-annotation,Scala,Autoboxing,Specialized Annotation,为了性能和安全,我想实现一个固定大小的向量,它是不变的和专用的(我需要快速算法)。我的第一个想法是使用@专用的注释(因为我需要整数和实数) 这里是第一次尝试: package so class Vec[@specialized A] private[so] ( ary: Array[A] ) { def apply( i: Int ) = ary(i) } 但是,当我使用javap分析结果字节码时,我可以看到元素仍然是装箱的。例如: public double apply$mcD$sp(i

为了性能和安全,我想实现一个固定大小的向量,它是不变的和专用的(我需要快速算法)。我的第一个想法是使用
@专用的
注释(因为我需要整数和实数)

这里是第一次尝试:

package so
class Vec[@specialized A] private[so] ( ary: Array[A] ) {
  def apply( i: Int ) = ary(i)
}
但是,当我使用
javap
分析结果字节码时,我可以看到元素仍然是装箱的。例如:

public double apply$mcD$sp(int);
  Code:
   0:   aload_0
   1:   iload_1
   2:   invokevirtual   #33; //Method apply:(I)Ljava/lang/Object;
   5:   invokestatic    #83; //Method scala/runtime/BoxesRunTime.unboxToDouble:(Ljava/lang/Object;)D
   8:   dreturn
看起来数组不是专门化的,这看起来很愚蠢,因为数组是在JVM上专门化的


我还能做些什么来达到我的目标吗?

您可能正在查看编译到Vec.class的代码。根据特殊化发生在子类中。这可以在REPL中进行验证:

scala> class Vec[@specialized A] ( ary: Array[A] ) {
     |   def apply( i: Int ) = ary(i)
     | }
defined class Vec

scala> new Vec( Array[Int](1) ).getClass
res0: java.lang.Class[_ <: Vec[Int]] = class Vec$mcI$sp

我想这就是您在使用
Int

时想要的,您使用的是什么版本?我用2.9.2看起来不错。我试过用2.9.2和2.8.2。
  public int apply(int);
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0       
         1: iload_1       
         2: invokevirtual #13                 // Method apply$mcI$sp:(I)I
         5: ireturn