2013-05-14 5 views
9

私はスカラのバリュークラスを自分のプロジェクトの一つに適用したいので、大きなオーバーヘッドなしに特定のプリミティブ型を充実させることができます。暗黙的な値クラスの継承はオーバーヘッドを導入しますか?

object Position { 

    implicit class Pos(val i: Int) extends AnyVal with Ordered[Pos] { 

    def +(p: Pos): Pos = i + p.i 

    def -(p: Pos): Pos = if (i - p.i < 0) 0 else i - p.i 

    def compare(p: Pos): Int = i - p.i 

    } 
} 

私の質問:私は彼ら(それによって大きなオーバーヘッドを導入)かを使用するときOrderedの継承はPosオブジェクトの割り当てを強制するのでしょうか?もしそうなら:これを回避する方法はありますか?

答えて

6

毎回PosOrdered[Pos]として処理され、割り当てが行われます。 割り当てが行われる必要がある場合がいくつかあります。http://docs.scala-lang.org/overviews/core/value-classes.html#when_allocation_is_necessaryを参照してください。 <を呼び出すような単純なものをやったときに

だから、あなたは割り当てを取得します:

val x = Pos(1) 
val y = Pos(2) 
x < y // x & y promoted to an actual instance (allocation) 

を、関連する規則は、(上記の記事から引用)されています

値のクラスが扱われるたび実際の値クラスのインスタンスは、 および のインスタンス化されていなければなりません。このルールの別のインスタンスは、値クラスが型引数として使用される場合です。避けるために:私たちはクラスPosition$Pos

のための「新しい」オペコードの2つのインスタンスを持つUPDATEを行う見ることができるように

0: aload_0 
1: iconst_1 
2: invokevirtual #21     // Method Pos:(I)I 
5: istore_1 
6: aload_0 
7: iconst_2 
8: invokevirtual #21     // Method Pos:(I)I 
11: istore_2 
12: new   #23     // class test/Position$Pos 
15: dup 
16: iload_1 
17: invokespecial #26     // Method test/Position$Pos."<init>":(I)V 
20: new   #23     // class test/Position$Pos 
23: dup 
24: iload_2 
25: invokespecial #26     // Method test/Position$Pos."<init>":(I)V 
28: invokeinterface #32, 2   // InterfaceMethod scala/math/Ordered.$less:(Ljava/lang/Object;)Z 

:上記のコードスニペットを分解

はこれを確認し、このようなシンプルな割り当てでは、たとえオリジナルの実装に転送するだけでも、各メソッドを手動でオーバーライドすることができます:

override def < (that: Pos): Boolean = super.<(that) 
override def > (that: Pos): Boolean = super.>(that) 
override def <= (that: Pos): Boolean = super.<=(that) 
override def >= (that: Pos): Boolean = super.>=(that) 

例でx < yを実行すると、割り当てが削除されます。 しかし、がOrdered[Pos]として処理される場合(Ordered[Pos]またはOrdered[T]のTを型パラメータとする方法に渡されたときのように)は依然としてこのままです。この特定のケースでは、あなたは依然として配分を得て、それを回避する方法はありません。

+0

あなたは配分を避けるためにどのような方法を知っていますか? – peri4n

+0

私の更新を確認してください。 –

+0

ありがとう – peri4n

関連する問題