Scala Upper Bounds: значение не является членом параметра типа - PullRequest
0 голосов
/ 10 февраля 2012

Почему Цена не может найти значение атрибута в 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 Ответ

3 голосов
/ 10 февраля 2012

Элемент типа 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)
}
...