[英]Scala Upper Bounds : value is not a member of type parameter
价格为何无法在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)
}
这个想法是您可以重新计算价格对象,并传递实现SeqValue的任何类型的对象,因为SeqValue具有值。
Calc
的类型成员S
被recalc
方法的类型参数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)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.