5

新しい型を導入することなく、 x の型がT特定の関数シグネチャを実装するジェネリック型 (たとえば ) になるように、メソッドでパラメーター x を定義することは可能ですか?def apply() : Double

[例] 目標は次のようなものを定義することです (説明のためにアドホック構文を使用しています):

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

現在、新しい type を導入することはできApplyDoubleますが、そのためには、インスタンスが有効なパラメーターであるすべての可能な型を 'foo' に拡張する必要があり、foo の署名は次のようになります。

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

4

1 に答える 1

8

確かに、それは構造型で可能であり、構文もほとんど正しくなっています。

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、リフレクティブ アクセスに関する警告が表示されます。これは、インポートまたはコンパイラ オプションを追加することで回避できます (警告メッセージで説明されています)。

構造型のメソッドの呼び出しには多少のオーバーヘッドが伴うことに注意してください。そのため、タイトな内部ループでこれが必要な場合は、アプローチを少し再考することをお勧めします。ただし、ほとんどの場合、おそらく顕著な違いはありません。

于 2013-07-29T19:19:12.027 に答える