Scala связанные черты, абстрактные типы - PullRequest
2 голосов
/ 17 сентября 2011

У меня есть 2 связанных черты.Dao будет использоваться как класс, а DaoHelper будет использоваться объектом-компаньоном Dao.Я хотел бы, чтобы черта Dao могла использовать функции, определенные в DaoHelper. Единственный способ выяснить, как это сделать, - определить черту компаньона как val.Однако каким-то образом компаньон ожидает, что его тип будет D.this.T, который, как я думал, я определил как подтип Doa.Я запутался здесь.Приношу свои извинения за новый вопрос, я из динамического языка.

/ test2.scala: 14: переопределение сопутствующего значения в черте Dao типа Test.DaoHelper [D.this.T];[значение] значение спутника имеет несовместимый тип [ошибка] значение параметра = D

object Test extends App {

  trait Dao {
    type T <: Dao
    val companion: DaoHelper[T]
    def getHelpfulData = companion.help
  }

  trait DaoHelper[Dao] {
    val help = "Some helpful data"
  }

  class D extends Dao {
    val companion = D
  }

  object D extends DaoHelper[D]
}

Ответы [ 2 ]

2 голосов
/ 17 сентября 2011

companion имеет тип DaoHelper [T], но T нигде не указывается в D, так как бы компилятор узнал, что это должен быть D в классе D?Вы можете исправить это, переопределив его в D.

class D extends Dao {
  type T = D
  val companion = D
}
0 голосов
/ 17 сентября 2011

Я не совсем понимаю, что вы пытаетесь сделать с class D, но вы получаете эту ошибку, потому что вы присваиваете D companion в class D, но companion имеет тип DaoHelper[T] как определено в Dao. Поскольку D имеет тип Dao и Dao не является подтипом DaoHelper[T], это не будет работать.

...