Для производительности и безопасности я хотел бы реализовать вектор фиксированного размера, который является неизменным и специализированным (мне нужна быстрая арифметика). Моя первая идея заключалась в использовании аннотации @specialized
(потому что мне нужны как целые числа, так и числа).
Вот первая попытка:
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.
Есть ли что-то, что я могу сделать для достижения своей цели?