8

トレイトの型パラメータを異なる型のセットに制限するにはどうすればよいですか (たとえば、ユニオン型によってバインドされます)?

具体例として、 must orの特性IntegralIndex[T]を作成したいと思います。TIntLong

ユニオン型に関するこの質問に対する最初の回答を試しました:

sealed abstract class NumericIndex[T]
object NumericIndex {
  implicit object IntWitness extends NumericIndex[Int]
  implicit object LongWitness extends NumericIndex[Long]
}

trait IntegralIndex[T : NumericIndex]

しかし、それはうまくいきません。私は得るtraits cannot have type parameters with context bounds `: ...' nor view bounds `<% ...'

他の提案はありますか?確かに、私はユニオン型に関する質問に対する他の解決策を理解していませんでした。そのため、答えがそこで別の答えを使用することであるか、それともそれができないことを知っているかをいただければ幸いです。

4

1 に答える 1

7

型クラスのアプローチは、ここで必要なことを達成するためのおそらく最もクリーンな方法であり、バージョンで正しい方向に進んでいます。コンテキスト境界は暗黙的なパラメーターの構文糖衣にすぎないため、現在の形式では機能しません。たとえば、次の特性定義:

trait IntegralIndex[T: NumericIndex]

次のようなものに脱糖されます。

trait IntegralIndex[T](implicit num: NumericIndex[T])

しかし、トレイトにはコンストラクタがないため、これは有効な Scala 構文ではありません。ただし、次のように書くこともできます。

trait IntegralIndex[T] {
  implicit def num: NumericIndex[T]
}

これにより、 の型クラスIntegralIndex[T]のインスタンスが存在するという証拠がない限り、 を作成できないことが保証されます。NumericIndexT

を実装するときはIntegralIndex、次のいずれかを記述します。

case class MyIndex[T](whatever: String)(implicit val num: NumericIndex[T])

または:

case class MyIndex[T: NumericIndex](whatever: String) {
  implicit val num = implicitly[NumericIndex[T]]
}

これで、すべての暗黙的な配管は、 を使用している誰からも見えなくなりましたMyIndex

于 2013-01-31T11:36:11.610 に答える