2

次の特性を共変にしたいのですが、それDistTraversableLikeは両方の型パラメーターで共変であることを知っています。

trait TraversableNumOps[T, Repr] extends DistTraversableLike[T, Repr] {

  private def min(a: T, b: T)(implicit num: Numeric[T]) =
    if (num.compare(a, b) <= 0) a else b
  private def max(a: T, b: T)(implicit num: Numeric[T]) =
    if (num.compare(a, b) > 0) a else b

  def maxD(implicit num: Numeric[T]): Option[T] =
    reduceD((a, b) => if (a >= b) a else b)
  def minD(implicit num: Numeric[T]): Option[T] =
    reduceD((a, b) => if (a < b) a else b)
  def sumD(implicit num: Numeric[T]): Option[T] =
    reduceD(_ + _)
  def productD(implicit num: Numeric[T]): Option[T] =
    reduceD(_ * _)

}

しかし、私はそれを壊さずにこれを管理することができませんでした。Numeric[T]問題は、Tで共変ではないものをサポートしたいということです。

Tとで共変になるようにこの特性を変更するにはどうすればよいReprですか?

4

1 に答える 1

2

Reprどのメソッド引数の型としても表示されないため、問題にはなりません。

ただし、T共変性の位置で発生します。とにprivate[this]修飾子を付けることでこれを修正できます。これにより、これらのメソッドが現在のオブジェクト内からのみ使用され、分散違反を現在のオブジェクトのスコープ内でコンパイラーがチェックできるようになります。minmax

その他の場合は、次maxDのスーパータイプを使用することを検討してくださいT

def maxD[U >: T](implicit num: Numeric[U]): Option[U]

Uこれにより、分散のスーパータイプを使用して分散に違反する方法がないため、分散の問題が解決されます(たとえば、タイプのフィールドを持つことができないTため、オブジェクトのフィールドに割り当てることはできません)。TraversableNumOpsU

于 2013-03-26T11:37:47.213 に答える