T类 - 解释

时间:2014-12-31 15:19:02

标签: scala slick typesafe

任何人都可以解释为什么我在我的特征中声明TableQuery时会出现以下编译器异常。

class type required but T found

T实际上不是Class类型,还是我错了?

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] {}

2 个答案:

答案 0 :(得分:1)

您收到此错误消息的原因是值位置TableQuery[T]实际为TableQuery.apply[T],这是一个扩展为new TableQuery(new T(_))的宏。仅从类型约束T <: Table[_]可以确定T是一个非抽象类,您可以在{公共构造函数)上调用new。 scalac给出的实际错误消息在这里不是很精确,但在右边的球场。

答案 1 :(得分:0)

您需要定义抽象的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]
 }