我们最近对我们的光滑代码进行了一些重构以使其成为通用代码,并且在此过程中我们制作了通用表(abstract classes
扩展Table
)。但是,当我们尝试使用Column[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]
}
让我们假设我们定义了一些表如下
class MyTable(tag:Tag) extends SomeTable[UserId,TestClass](tag,"my_table") {
def someColumn = column[UserId]("user_id")
}
我们将UserId
定义如下
case class UserId(l:Long) extends AnyVal
现在我们已经有MappedColumnType
UserId
,即
implicit val userIdType = MappedColumnType.base[UserId,Long]
(_.id,UserId)
问题是,您似乎无法使用BaseTypeType
(由MappedColumnType.base
创建)来推断Column[T]
的类型
在上面的例子中,以及我想要做的最终结果(写一个通用查询),我们可能会写这样的东西。
def someGenericQuery[C,T<:SomeTable[T]](c:Query[T,C,Seq]) = {
c.filter(_.someColumn === 1l)
}
这样的东西可以在浮油吗?不幸的是我不能使用名义输入(即使我的UserId
扩展另一个类/特征)因为值类不允许(它们不能扩展或扩展任何东西),所以似乎没有任何方法以通用方式显示值类的内部类型(在本例中为Long)