Scala 带有[T]列和Slick的通用表定义
我们最近对光滑的代码进行了一些重构,使其具有通用性,在此过程中,我们制作了通用表,这些表是扩展表的抽象类。然而,当我们试图创建一个具有列[T]的通用表时,出现了一个问题,如下所示 注意:下面的代码没有编译,这只是试图显示我在做什么Scala 带有[T]列和Slick的通用表定义,scala,generics,slick,Scala,Generics,Slick,我们最近对光滑的代码进行了一些重构,使其具有通用性,在此过程中,我们制作了通用表,这些表是扩展表的抽象类。然而,当我们试图创建一个具有列[T]的通用表时,出现了一个问题,如下所示 注意:下面的代码没有编译,这只是试图显示我在做什么 abstract class SomeTable[T :BaseTypedType,C](tag:Tag,name:String)(implicit mappedTypeMapperEvidence:BaseColumnType[T], longEvidence T
abstract class SomeTable[T :BaseTypedType,C](tag:Tag,name:String)(implicit mappedTypeMapperEvidence:BaseColumnType[T], longEvidence T <:< Long) extends Table[C](tag,name) {
def someColumn:Column[T]
}
我们对UserId的定义如下
class MyTable(tag:Tag) extends SomeTable[UserId,TestClass](tag,"my_table") {
def someColumn = column[UserId]("user_id")
}
case class UserId(l:Long) extends AnyVal
现在我们已经有了这个用户ID的MappedColumnType,即
问题是,您似乎无法使用MappedColumnType.base创建的BaseType来推断列[T]的类型
在上面的例子中,以及我试图编写一个通用查询的最终结果,我们可能会编写类似这样的代码
def someGenericQuery[C,T<:SomeTable[T]](c:Query[T,C,Seq]) = {
c.filter(_.someColumn === 1l)
}
这样的事情在斯威克可能发生吗?不幸的是,我不能使用名义类型,即让我的UserId扩展另一个类/特征,因为值类不允许它们不能扩展或扩展任何内容,因此似乎没有任何方法可以以通用的方式长时间显示值类的内部类型您得到的确切编译时错误是什么?我很惊讶这不起作用。为什么你要用你得到的错误来证明这个用户ID
def someGenericQuery[C,T<:SomeTable[T]](c:Query[T,C,Seq]) = {
c.filter(_.someColumn === 1l)
}