为什么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有一个值。
答案 0 :(得分:3)
S
中的类型成员Calc
被S
方法的类型参数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)
}