首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使该特征协变

如何使该特征协变
EN

Stack Overflow用户
提问于 2013-03-26 18:41:21
回答 1查看 361关注 0票数 2

我想要使以下特征协变,因为知道DistTraversableLike在两个类型参数中都是协变的:

代码语言:javascript
复制
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中不是协变的。

如何将此特征修改为TRepr中的协变

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-26 19:37:47

Repr应该不是问题,因为它不会作为任何方法参数的类型出现。

然而,T确实发生在逆变位置。您可以通过在minmax上添加private[this]修饰符来对此进行修改。这将确保仅在当前对象中使用这些方法,并且编译器可以在当前对象的范围内检查差异冲突。

对于maxD和其他人,可以考虑让它们接受T的超类型

代码语言:javascript
复制
def maxD[U >: T](implicit num: Numeric[U]): Option[U]

这解决了方差问题,因为没有办法使用T的超类型U并违反方差(例如,您不能将其分配给对象的字段,因为TraversableNumOps不能具有U类型的字段)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15635000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档