联合类型绑定到特征的类型参数(scala)

Imr*_*hid 8 scala

如何将特征的类型参数约束为一组不同的类型(例如,由联合类型约束)?

作为一个具体的例子,我想创建一个特征IntegralIndex[T],其中T必须IntLong.

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

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

trait IntegralIndex[T : NumericIndex]
Run Code Online (Sandbox Code Playgroud)

但这不起作用; 我明白了traits cannot have type parameters with context bounds `: ...' nor view bounds `<% ...'

还有其他建议吗?诚然,我不理解关于工会类型问题的其他解决方案,所以如果答案只是在那里使用不同的答案,或者甚至知道无法完成,我会很感激.

Tra*_*own 6

类型类方法可能是在这里完成您想要的最简洁的方法,并且您的版本正确.它不能以当前形式工作,因为上下文边界只是隐式参数的语法糖.以下特征定义,例如:

trait IntegralIndex[T: NumericIndex]
Run Code Online (Sandbox Code Playgroud)

会不会像这样的东西:

trait IntegralIndex[T](implicit num: NumericIndex[T])
Run Code Online (Sandbox Code Playgroud)

但是traits没有构造函数,所以这不是有效的Scala语法.但是,您可以这样写:

trait IntegralIndex[T] {
  implicit def num: NumericIndex[T]
}
Run Code Online (Sandbox Code Playgroud)

IntegralIndex[T]除非您有证据表明存在NumericIndex类型类的实例,否则这将确保您无法创建T.

现在,当你实施时IntegralIndex,你要写:

case class MyIndex[T](whatever: String)(implicit val num: NumericIndex[T])
Run Code Online (Sandbox Code Playgroud)

要么:

case class MyIndex[T: NumericIndex](whatever: String) {
  implicit val num = implicitly[NumericIndex[T]]
}
Run Code Online (Sandbox Code Playgroud)

现在所有使用的隐藏管道都是不可见的MyIndex.