【发布时间】:2014-05-10 22:13:53
【问题描述】:
我正在为我的 play2/slick2 项目开发一个抽象的 CRUD-DAO。为了获得方便的类型安全主 ID,我使用 Unicorn 作为光滑 MappedTo 和 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])
这对我来说似乎非常多余。我能够提供来自T 的tableName 和query,在我自己的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]
如果没有运行时反射,这可能吗?如果仅通过运行时反射:我如何在类定义中使用 Manifest 以及对响应式应用程序的性能影响有多大?
另外,由于我对这门语言还很陌生并且自己工作:这在 scala 中是不是很好?
感谢您的帮助。随意批评我的问题和英语。改进当然会提交给 Unicorn git-repo
编辑:
实际上,TableQuery[T].baseTableRow.tableName, TableQuery[T] 不起作用,因为错误 class type required but T found,IDEA 表面上很好,但 scalac 不是。
【问题讨论】:
-
有关
TableQuery[T].baseTableRow.tableName错误的解释,请参阅此其他答案。错误是在宏内部发出的,这可能是 IntelliJ 无法检测到它的原因。
标签: scala generics inheritance slick-2.0