Scala Upper Bounds:值不是类型参数的成员

时间:2012-02-09 20:05:49

标签: generics scala bounds

为什么Price无法在SeqValue上找到属性值?看起来很简单,应该可行。

我得到了错误

[error]   .... value value is not a member of type parameter SeqValue
[error]   def recalc[SeqValue](input:SeqValue) = Price(1 + seq, input.value)    

以下代码

sealed trait SeqValue {
  def seq:Int
  def value:Float
  override def toString = ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE)
}

sealed trait Calc {
  type S <: SeqValue
  def recalc[S](input:S):SeqValue
}

case class Price(seq:Int=0, value:Float=.0f) extends SeqValue with Calc {
  def recalc[SeqValue](input:SeqValue) = Price(1 + seq, input.value)
}

这个想法是你可以重新计算price对象,并传入实现SeqValue的任何类型的对象,因为SeqValue有一个值。

1 个答案:

答案 0 :(得分:3)

S中的类型成员CalcS方法的类型参数recalc遮蔽。

第二个错误:抽象类型S必须在班级Price中定义。

以下内容应该有效:

sealed trait SeqValue {
  def seq:Int
  def value:Float
  override def toString = ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE)
}

sealed trait Calc {
  type S <: SeqValue
  def recalc(input:S):SeqValue
}

case class Price(seq:Int=0, value:Float=.0f) extends SeqValue with Calc {
  type S = SeqValue
  def recalc(input:SeqValue) = Price(1 + seq, input.value)
}

修改(响应评论)

我不明白你正在尝试做什么,但你可以在单独的mixin特性中分离出类型定义。

trait SAsSeqValue {
  type S = SeqValue
}

case class Price(seq:Int=0, value:Float=.0f) extends SeqValue with Calc with SAsSeqValue {      
  def recalc(input:SeqValue) = Price(1 + seq, input.value)
}