簡體   English   中英

Scala:需要類類型,但在特征中找到{泛型類型}

[英]Scala: class type required but {generic type} found in trait

我正在使用Slick 3.0並嘗試創建一個特性來提供基本操作。 這是我的特點:

object DAO {
  var db: Database = null
}

trait CommonAPI[T <: Table[_]] {
  private val db = DAO.db
  private val objects = TableQuery[T]

  def count: Future[Int] = db.run(objects.length.result)
  def insert(obj: T#TableElementType): Future[Int] = db.run(objects += obj)
  def all: Future[Seq[T]] = db.run(objects.result)
}

DAO.db在Play的onStart方法中初始化。 但是,我遇到了class type required but T found編譯錯誤class type required but T found在行private val objects = TableQuery[T] class type required but T foundclass type required but T found private val objects = TableQuery[T]

我應該做些什么? 謝謝!

這是一個解決方案:

首先,定義它以避免類類型問題..

class Service[T <: Table[_]](path: String, cons: Tag => T){

  lazy val db = Database.forConfig(path)

  def query = TableQuery[T](cons)
}

然后以這種方式使用它,Post是表的子類:

object Abcd {

  object Def extends Service[Post]("mydb", abc) {



    def test = {


      //db

      val q = query.drop(1).take(20)
      val r = db.run(q.result)

      println(q.result.statements.head)
      println(r)

      r

    }
  }

  private def abc(tag: Tag) = new Post(tag)

}

此解決方案測試正常。

嗨,我做了類似的事情。 我用了一點不同的方法。 我有一個通用的DAO和很少(每個資源/表)類只是為它繼承。

這是通用的DAO:

class BaseDbEntity[T <: BaseEntity, R <: BaseT[T]](val tableName: String, tableQuery: TableQuery[R]) extends DatabaseAccess{

  val createReturningId = tableQuery returning tableQuery.map{item => item.id}

  def create(entity: T): Int = {
    connectionPool withSession {
      implicit session =>
        val resId = createReturningId += entity
        resId
    }
  }

  def getAll = {
    connectionPool withSession {
      implicit session =>
        tableQuery.list
    }
  }
}

全班代碼:( https://github.com/vixxx123/scalasprayslickexample/blob/master/src/main/scala/com/vixxx123/scalasprayslickexample/database/BaseDbEntity.scala

和具有相應表類的特定DAO:

class PersonDao extends BaseDbEntity[Person, PersonT]("person", TableQuery[PersonT])

class PersonT(tag: Tag) extends BaseT[Person](tag, "person") {
  def name: Column[String] = column[String]("name")
  def lastname: Column[String] = column[String]("lastname")

  override def * = (id.?, name, lastname) <> (
    (Person.apply _).tupled, Person.unapply)
}

你可以在這里找到這個課程: https//github.com/vixxx123/scalasprayslickexample/blob/master/src/main/scala/com/vixxx123/scalasprayslickexample/exampleapi/person/PersonDao.scala

也許它會幫助你。

如果您的表類定義為:您可以傳遞標記,並從中創建表查詢:

case class Sample(....)

class SampleTable(tag: Tag)
  extends Table[Sample](tag, "sample_table") {
    .....
}

然后你可以實現你的通用特征如下:

import scala.slick.driver.MySQLDriver.simple.Tag // here mysql is used , you can import the driver specific to your db

object DAO {
  var db: Database = null
}

trait CommonAPI[T, A<: Table[T]] {
  private val db = DAO.db
  private val tableTag : Tag => A = _
  def setTag(tag : Tag => A) = { tableTag = tag }
  private val objects = TableQuery(tableTag)

  def count: Future[Int] = db.run(objects.length.result)
  def insert(obj: T#TableElementType): Future[Int] = db.run(objects += obj)
  def all: Future[Seq[T]] = db.run(objects.result)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM