Тип класса T - объяснение

Может ли кто-нибудь объяснить мне, почему я получаю следующее исключение компилятора при объявлении TableQuery внутри моего типажа.

class type required but T found

Разве T на самом деле не тип класса или я ошибаюсь?

trait TableModel[T <: Table[_]] {
  val table: TableQuery[T] = TableQuery[T]    <~~~~~~~~~~ class type required but T found

  def exists(implicit session: Session): Boolean =
    (!MTable.getTables(table.baseTableRow.tableName).list.isEmpty)

  def schemaDescription: MySQLDriver.SchemaDescription = table.ddl

  def create(implicit session: Session): Unit =  schemaDescription.create

  def drop(implicit session: Session): Unit =  schemaDescription.drop
}


object UsersTable extends TableModel[Users] {}

person MrX    schedule 31.12.2014    source источник


Ответы (2)


Причина, по которой вы получаете это сообщение об ошибке, заключается в том, что TableQuery[T] в позиции значения на самом деле является TableQuery.apply[T], который является макросом, который расширяется до new TableQuery(new T(_)). Только из-за ограничения типа T <: Table[_] нельзя быть уверенным, что T является неабстрактным классом, для которого вы можете вызывать new (открытый конструктор). Фактическое сообщение об ошибке, которое scalac дает здесь, не очень точное, но на правильном уровне.

person cvogt    schedule 09.01.2015

Вам нужно определить абстрактную ссылку TableQuery вместо конкретной.

trait TableModel[T <: Table[_]] {

   val table: TableQuery[T]

   def exists(implicit session: Session): Boolean =
    (!MTable.getTables(table.baseTableRow.tableName).list.isEmpty)

   def schemaDescription: MySQLDriver.SchemaDescription = table.ddl

   def create(implicit session: Session): Unit = schemaDescription.create

   def drop(implicit session: Session): Unit = schemaDescription.drop
  }

object UsersTable extends TableModel[Users] {
 val table = TableQuery[Users]
 }
person Sky    schedule 01.01.2015