Scala Upper Bounds: значение не является членом параметра типа
Почему Цена не может найти значение атрибута в 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 имеет значение.
1 ответ
Решение
Тип члена 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)
}
Изменить: (в ответ на комментарий)
Я не понимаю, что именно вы пытаетесь сделать, но вы можете выделить определение типа в отдельной черте миксина.
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)
}