作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在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
,所以我必须在一个父类(super class)中定义这些方法,从那里扩展我的对象(
object Coolers extends TableUtils[Coolers, Cooler]
)。为了定义这些方法,我需要
tableQuery
从这个父类(super class)中移出我的对象,因此我尝试了如下操作:
abstract class TableUtils[T <: Table[A] , A] {
val tableQuery = TableQuery[T]
}
tableQuery
定义的错误:
class type required but T found
最佳答案
当您执行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
仅可用于具体类型。
TableQuery.apply
(在知 Prop 体类型的时候)以及隐式宏,以提供该类型类的实例。然后,您将获得类似以下内容的信息:
abstract class TableUtils[T <: Table[A] : TableQueryBuilder, A] {
val tableQuery = BuildTableQuery[T]
}
TableQueryBuilder
是类型类,而
BuildTableQuery
是
TableQuery.apply
的替代版本,它将转发到
TableQueryBuilder
实例以执行实际的实例化。
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]
}
关于scala - 如何在Scala中定义泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20090228/
我是一名优秀的程序员,十分优秀!