Черта, связанная с Scala, абстрактные типы

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

/test2.scala:14: переопределение сопутствующего значения в характеристике Dao типа Test.DaoHelper [D.this.T]; [error] value companion имеет несовместимый тип [error] val companion = 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]
}

person gobagoo    schedule 17.09.2011    source источник


Ответы (2)


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

class D extends Dao {
  type T = D
  val companion = D
}
person Kim Stebel    schedule 17.09.2011
comment
Ах, я понимаю, о чем вы говорите. На самом деле я хотел избежать явного объявления типа в конкретном классе. После того, как все обошлось, волшебный '_': val companion: DaoHelper[_ <: Dao]. Я должен был знать. Я предполагаю, что это означает, что принять любой тип для конструктора типа DaoHelper, который имеет супертип Dao ??? Очевидно, я полностью избавился от буквы T. - person gobagoo; 17.09.2011

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

person schmmd    schedule 17.09.2011
comment
D (объект) не имеет типа Dao, он расширяет DaoHelper[D]. - person Kim Stebel; 17.09.2011
comment
Я думаю, что присваиваю объект D val companion. объект D является подтипом DaoHelper [D], а класс D - подтипом Dao. - person gobagoo; 17.09.2011
comment
Возможно, я смогу перефразировать свои требования, потому что согласен с тем, что я не очень хорошо их объяснил. У меня есть 2 черты характера, одна будет использоваться для класса, а другая - для объекта. Объект будет сопутствующим объектом для класса. Я хотел бы иметь возможность ссылаться на сопутствующий объект в классе, но не явно (Not Classname.function ()). Похоже, что установка val в трейте, от которого происходит класс, который соответствует объекту-компаньону, казалась самым простым способом. Однако я не уверен, какой тип использовать для этого значения. - person gobagoo; 17.09.2011