我正在为我的 play2/slick2 项目开发一个抽象的 CRUD-DAO。为了获得方便的类型安全主 ID,我使用UnicornMappedTo
作为 slicks &之上的额外抽象和便利ColumnBaseType
。
Unicorn 提供了一个基本的 CRUD-DAO 类BaseIdRepository
,我想进一步扩展它以满足项目的特定需求。类的签名是
class BaseIdRepository[I <: BaseId, A <: WithId[I], T <: IdTable[I, A]]
(tableName: String, val query: TableQuery[T])
(implicit val mapping: BaseColumnType[I])
extends BaseIdQueries[I, A, T]
这导致 DAO 实现看起来像
class UserDao extends
BaseIdRepository[UserId, User, Users]("USERS", TableQuery[Users])
这对我来说似乎非常多余。我能够提供tableName
和query
来自T
,在我自己的 Abstract DAO 上给我以下签名
abstract class AbstractIdDao[I <: BaseId, A <: WithId[I], T <: IdTable[I, A]]
extends BaseIdRepository[I,A,T](TableQuery[T].baseTableRow.tableName, TableQuery[T])
在 Scala 中是否有可能以某种方式推断类型I
并A
进行如下签名?(Users
是一个类扩展IdTable
)
class UserDao extends AbstractIdDao[Users]
如果没有运行时反射,这可能吗?如果仅通过运行时反射:我如何在类定义中使用清单以及反应式应用程序中的性能影响有多大?
另外,由于我对这门语言还很陌生并且自己工作:这在 scala 中是不是很好?
谢谢你的帮助。随意批评我的问题和英语。改进当然会提交给 Unicorn git-repo
编辑:
实际上,TableQuery[T].baseTableRow.tableName, TableQuery[T]
由于需要错误类类型,但 T found不起作用,IDEA 表面上很好,但 scalac 不是。