如何在Scala中定义泛型类型?
在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 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] } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |