2

私はこのようなNumber Wrapperを持っています

class NumWrapper[A<:AnyVal](var v: A)(implicit n:Numeric[A]) {
  def +(other: A): NumWrapper[A] = {
    new NumWrapper(n.plus(v, other))
  }

  def -(other: A): NumWrapper[A] = {
    new NumWrapper(n.minus(v, other))
  }
}

すべて正常に動作します。しかし、暗黙的な変換が必要な場合は、次のようにコンパニオン クラスを作成します。

object NumWrapper {
  implicit def toNumWrapper[A<:AnyVal](v: A) = new NumWrapper[A](v)
}

しかし、コンパイル時にエラーが発生しました:

パラメータ n の暗黙的な値が見つかりませんでした: Numeric[A]

ここで何が問題なのですか? コンパイル時にタイプ A の暗黙的な一致を見つけようとしているのはなぜですか?

ご助力ありがとうございます。

4

2 に答える 2

1

Scala の暗黙のチェックはコンパイル時に実行されます (これは静的に型付けされた言語です)。コンパイラは、呼び出し場所で使用できる単一の明確な一致する暗黙の値を識別できない場合、エラーを出します。

ここでこれを修正する 1 つの方法は、toNumWrapper メソッドに暗黙の要件を追加することです。

object NumWrapper {
  implicit def toNumWrapper[A<:AnyVal](v: A)(implicit n:Numeric[A]) = new NumWrapper[A](v)
}

これにより、暗黙的な数値の要件が、暗黙的な変換が必要な場所にプッシュされます。たとえば、コンソールで、次のように記述できます。

scala> val chk1 = 3L
chk1: Long = 3

scala> val chk2 = NumWrapper.toNumWrapper(chk1)
chk2: NumWrapper[Long] = NumWrapper@1e89017a

そして、コンパイラは満足しています (私が思うに、これについて完全には確信が持てません)、Long 値には独自の暗黙的な Numeric[Long] が含まれているからです。

于 2015-05-29T01:21:11.787 に答える
0

あなたのコードによると、

class NumWrapper[A<:AnyVal](var v: A)(implicit n:Numeric[A])

new NumWrapper[MyType](v)aを呼び出すNumeric[MyType]には、暗黙的な解決の範囲内にある必要があります。

だからあなたが持っているとき

object NumWrapper {
  implicit def toNumWrapper[A<:AnyVal](v: A) = new NumWrapper[A](v)
}

NumWrapperこのコンストラクターを呼び出している場合、Numeric[A]解決する必要があります。そうではなく、コンパイラは前述のエラーを発生させます。

于 2015-05-28T23:06:45.693 に答える