2017-04-27 8 views
0

を受け入れる:メイク機能は、以下のスカラ値のタイプを想像してみて、私のIntベースの値型

class Prime(val self: Int) extends AnyVal { 
    def +(i: Int): Int = self+i 
} 

は、どのように私は私の機能incは、引数としてPrimeを受け入れるだけでなく、任意の正規Intすることができますか?私は、この関数の呼び出しを許可するように変更のいずれかPrimeまたはincを作るための方法を探しています

scala> inc(new Prime(2)) 
<console>:10: error: type mismatch; 
found : Prime 
required: Int 
     inc(new Prime(2)) 
     ^

def inc(i: Int): Int = i + 1 

は今のところ、私は次のタイプのエラーが発生します。

答えて

0

Primeは、コンパイル時ではなく実行時にintになるため、変換するためにintへの変換器が必要です。

implicit def backToInt(p:Prime): Int = p.self 

これで暗黙的にintに変換されるinc(new Prime(2))を渡すことができます。しかしこれは型安全性である値型の点を打ち破っています。

+0

提案していただきありがとうございます。型引数に 'Int'を使うようにこれを拡張する方法はありますか?私。これは次のようにも動作します: 'Def sum(Iterable [Int])= is.fold(0)(_ + _)' ... 'sum(Seq(new Prime(2)、new Prime 3))) ' – derabbink

+0

なぜマップマップ' points.map(_。self) 'を使用しないのですか –

+0

実際のロジックから気を散らすので、余分な変換を入力する手間を省きたいのですがなぜ – derabbink

関連する問題