2012-04-21 27 views
12

Để thực hiện và an toàn Tôi muốn thực hiện một vector có kích thước cố định vừa không thay đổi vừa chuyên dụng (tôi cần các loại mỹ phẩm nhanh). Ý tưởng đầu tiên của tôi là sử dụng chú thích @specialized (vì tôi cần cả số nguyên và số thực).Thực hiện một kích thước cố định, không thay đổi, và vector chuyên ngành

Đây là một thử đầu tiên:

package so 
class Vec[@specialized A] private[so] (ary: Array[A]) { 
    def apply(i: Int) = ary(i) 
} 

Tuy nhiên, khi tôi phân tích bytecode kết quả với javap, tôi có thể thấy rằng các yếu tố vẫn được đóng hộp. Ví dụ:

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 

Dường như mảng không chuyên ngành có vẻ ngớ ngẩn, vì mảng chuyên về JVM.

Tôi có thể làm gì để đạt được mục tiêu của mình không?

+0

Bạn đang sử dụng phiên bản nào? Có vẻ ổn với tôi với 2.9.2. –

+0

Tôi đã thử với cả 2.9.2 và 2.8.2. – paradigmatic

Trả lời

9

Bạn có thể xem mã được biên dịch thành Vec.class. Theo this thread chuyên môn xảy ra trong các lớp con. Điều này có thể được xác nhận trong 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 

Như bạn có thể nhìn thấy cho Int nó được sử dụng lớp con Vec$mcI$sp. Và nếu bạn chạy javap trên lớp đó, bạn sẽ thấy rằng nó là infact chuyên mã đúng cách. Đây là những gì áp dụng phương pháp trông giống như trong Vec$mcI$sp.class sử dụng javap:

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  

Mà tôi giả sử là những gì bạn muốn khi sử dụng Int.

Các vấn đề liên quan