2013-07-29 13 views
5

xの型が、指定された関数シグネチャを実装する汎用型Tであるような方法でパラメータxを定義することは可能ですか(def apply() : Doubleとしましょう)。新しいタイプ?目標は、(私は例示のためにアドホック構文を使用しています)のようなものを定義することですスカラと指定された操作でバインドされた型

[例]:現在

def foo(x : T with def apply() : Double) = { ... }

を、私は新しいタイプApplyDoubleを導入したが、その可能性その後、

def foo(x : ApplyDouble) = { ... }

答えて

8

Sに変えられるすべての可能なインスタンスを持つ「FOO」に法的なパラメータであり種類、および、fooの署名を拡張し、私を必要としますURE、それは構造型で可能だし、あなたも、ほとんどの構文右持っている:

def foo(x: { def apply(): Double }) = x.apply 

そして:

scala> foo(() => 13.0) 
res0: Double = 13.0 

または:

scala> foo(new { def apply() = 42.0 }) 
res1: Double = 42.0 

fooの定義を反射的なアクセスに関する警告が表示されます。これは、インポートまたはコンパイラオプションを追加することで回避できます(警告メッセージの説明を参照)。

構造型のメソッドを呼び出す際にオーバーヘッドが発生することに注意してください。内側のループでこのメソッドを呼び出す必要がある場合は、アプローチを少し考え直したいことがあります。しかし、ほとんどの場合、おそらく目立つ違いはありません。

+0

ありがとうございました。それはまさに私が探していたものです;) – leco

関連する問題