8

如何将特征的类型参数限制为一组不同的类型(例如,由联合类型绑定)?

作为一个具体的例子,我想IntegralIndex[T]TmustIntLong.

我尝试了关于联合类型的这个问题的第一个答案:

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]
}

这样可以确保您无法创建 a IntegralIndex[T],除非您有证据表明存在 的NumericIndex类型类的实例T

现在,当您实施 时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 回答