在Scala中访问类型参数的类级值

在Scala中访问类型参数的类级值,scala,Scala,我有一个trait和一个case类来实现它。实现覆盖的trait的一个特性是默认值。我找不到一个好方法从一个由该特性的特定实现参数化的类访问这个默认值 这是最少的代码,因此它不再真正演示动机,但它确实演示了错误: import scala.language.implicitConversions trait Distance[T] { val Zero: T def +( that: T ): T } case class DoubleDistance( val v: Double

我有一个trait和一个case类来实现它。实现覆盖的trait的一个特性是默认值。我找不到一个好方法从一个由该特性的特定实现参数化的类访问这个默认值

这是最少的代码,因此它不再真正演示动机,但它确实演示了错误:

import scala.language.implicitConversions

trait Distance[T] {
  val Zero: T
  def +( that: T ): T
}

case class DoubleDistance( val v: Double ) extends Distance[DoubleDistance] {
  val Zero = DoubleDistance( 0.0 )
  def +( that: DoubleDistance ) = DoubleDistance( v + that.v )
}

object DistanceImplicits {
  implicit def DoubleToDistance( v: Double ) = new DoubleDistance( v )
}

class User[T<:Distance[T]] {
  val default: T = T.Zero // This line gives me a compilation error
}

当我需要在我的
用户
类中构造一个
数组[T]
时,我可以通过在我的参数中添加
隐式类型标签:类标签[T]
来实现,但这似乎没有任何效果。

这个零应该来自哪里?你想做这样的事吗

class User[T<:Distance[T]] {
  self:Distance[T] =>
  val default: T = Zero
}
class用户[T]
val默认值:T=0
}

零应该从哪里来?你想做这样的事情吗

class User[T<:Distance[T]] {
  self:Distance[T] =>
  val default: T = Zero
}
class用户[T]
val默认值:T=0
}

< /代码> 首先,为什么这不起作用:考虑不同的实现<代码>距离< /> >

case class DoubleDistance1(val v: Double) extends Distance[DoubleDistance1] {
  val Zero = this
  def +(that: DoubleDistance1) = ??? // doesn't matter
}
您希望DoubleDistance1.Zero是什么意思?您可以使用“类型类”使其工作:


首先,为什么这不起作用:考虑不同的实现<代码>距离< /> > < /P>

case class DoubleDistance1(val v: Double) extends Distance[DoubleDistance1] {
  val Zero = this
  def +(that: DoubleDistance1) = ??? // doesn't matter
}
您希望DoubleDistance1.Zero是什么意思?您可以使用“类型类”使其工作:


这看起来像是的经典用例。与其将
距离
特征的实例与每个感兴趣的值相关联,不如将一个实例与每个感兴趣的类型相关联:

trait Distance[T] {
  val Zero: T
  def +( a: T, b: T ): T
}

implicit object DoubleDistance extends Distance[Double] {
  val Zero = 0.0
  def +( a: Double, b: Double ) = a + b
}

class User[T : Distance] {
  val default: T = implicitly[Distance[T]].Zero 
}

这看起来像是的经典用例。与其将
距离
特征的实例与每个感兴趣的值相关联,不如将一个实例与每个感兴趣的类型相关联:

trait Distance[T] {
  val Zero: T
  def +( a: T, b: T ): T
}

implicit object DoubleDistance extends Distance[Double] {
  val Zero = 0.0
  def +( a: Double, b: Double ) = a + b
}

class User[T : Distance] {
  val default: T = implicitly[Distance[T]].Zero 
}

一旦明确了类型类是我需要的概念,我发现除了Aaron链接的概念之外,它非常有用。一旦明确了类型类是我需要的概念,我发现除了Aaron链接的概念之外,它非常有用。