加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在Scala中定义泛型类型?

发布时间:2020-12-16 18:59:05 所属栏目:安全 来源:网络整理
导读:在Slick 2中,我们可以映射这样的表: case class Cooler(id: Option[Int],minTemp: Option[Double],maxTemp: Option[Double])/** * Define table "cooler". */class Coolers(tag: Tag) extends Table[Cooler](tag,"cooler") { def id = column[Int]("id",O.P
在Slick 2中,我们可以映射这样的表:

case class Cooler(id: Option[Int],minTemp: Option[Double],maxTemp: Option[Double])

/**
 * Define table "cooler".
 */
class Coolers(tag: Tag) extends Table[Cooler](tag,"cooler") {
  def id = column[Int]("id",O.PrimaryKey,O.AutoInc)
  def minTemp = column[Double]("min_temp",O.Nullable)
  def maxTemp = column[Double]("max_temp",O.Nullable)

  def * = (id.?,minTemp.?,maxTemp.?) <> (Cooler.tupled,Cooler.unapply _)
}

object Coolers {
  val tableQuery = TableQuery[Coolers]
}

因为我有很多表,我想为它们定义泛型方法,比如find,delete,update所以我必须在超类中定义这些方法,从哪里扩展我的对象(对象Coolers扩展TableUtils [Coolers,Cooler] ).为了定义那些方法,我需要tableQuery来移出这个超类中的对象,所以我尝试了它:

abstract class TableUtils[T <: Table[A],A] {

val tableQuery = TableQuery[T]  

}

但是我在tableQuery定义上收到错误:

需要类类型但是找到了T.

有谁知道我做错了什么?

解决方法

当您执行TableQuery [T]时,您实际上正在调用TableQuery.apply,即 is actually a macro.

此宏的主体尝试实例化T,但在您的情况下,T已成为编译器不知道如何实例化的(未知)类型参数.问题类似于尝试编译:

def instantiate[T]: T = new T
// Does not compile ("class type required but T found")

实际效果是TableQuery.apply只能用于具体类型.

您可以解决using a type class to capture the call to TableQuery.apply(在具体类型已知的位置)以及隐式宏以提供此类型类的实例.然后你会有类似的东西:

abstract class TableUtils[T <: Table[A] : TableQueryBuilder,A] {
  val tableQuery = BuildTableQuery[T]
}

其中TableQueryBuilder是类型类,而BuildTableQuery是TableQuery.apply的替代版本,它将转发到TableQueryBuilder实例以执行实际的实例化.

我在another answer here中添加了一个实现.

将tableQuery声明为抽象值并在TableUtils的每个具体派生类中定义它将更容易(如果不太方便):

abstract class TableUtils[T <: Table[A],A] {
  val tableQuery: TableQuery[T,T#TableElementType]
  // define here your helper methods operating on `tableQuery`
}
object Coolers extends TableUtils[Coolers,Cooler] {
  val tableQuery = TableQuery[Coolers]
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读