簡単な例で説明するのは簡単だと思います。スカラ:特定のメソッドを実装するジェネリッククラスを指定することは可能ですか?
squared
メソッドを実装し、implicit def
を使用して、*
オペレータをサポートする任意のクラスに自動的に追加したいと思います。 intであり
それは非常に簡単です:
class EnhancedInt(x: Int) { def squared = x * x }
implicit def IntToEnchancedInt(x: Int) = new EnhancedInt(x)
しかし、どれかAnyValと、私は次のエラーを取得する:
scala> class EnhanceAny(x: AnyVal) { def squared = x * x }
<console>:7: error: value * is not a member of AnyVal
class EnhanceAny(x: AnyVal) { def squared = x * x }
私は任意の数値に適用できるか知りたいですクラス、またはさらには、*
オペレータをサポートする任意のクラスに適用できます。
+1良い質問です。これは私が問題を抱えているScalaのものです。ハスケルではghciで ':t \ x - > x * x'を使うだけです(それは' Num a => a - > a'です)。しかし、Scalaでは 'x => x * x'をREPLで実行すると、 '' x''型を与えていないことが分かります。そして、私は手を振って、Scalaの型システムがHaskellのものよりも "強力"であることを思い出させます。 –
AnyValではなくNumericで動作する可能性があります。 Seq.product()が乗算へのアクセスをどのように管理しているかを見てください。 – scand1sk
@ダンバートン:質問を正しく解釈していない可能性があります。下のDan Simonの答えを見てください。 – missingfaktor