【发布时间】:2021-09-13 16:38:10
【问题描述】:
我正在尝试构建一个用任一类型的具体类实例化的通用 DAO:
- 常规
- Snappy <:>
我目前有一个描述可用方法的 trait DAO,get/create/upsert。在编译时,我想根据我传递的类型参数更改/定义每个方法。这是一些代码:
trait Regular {
id: int
}
trait Snap extends Regular {
isSnappy: Boolean = true
}
trait DAO[T<: Regular] {
def get(id: String)(implicit x: Param,ct: ClassTag[T]): Future[Either[String, T]]
}
如果特征是常规的:
def get(id:String)(implicit x: Param,ct: ClassTag[T]): Future[Either[String, T]] = {
//Handle regular trait flow
}
如果特征是 Snap <: regular:>
def get(id:String)(implicit x: Param,ct: ClassTag[T]): Future[Either[String, T]] = {
//Handle snappy
}
两个 def 将返回相同的类型 T。
我希望能够在编译时更改 def,因为我知道 DAO 中的 Type 参数。然后在运行时我希望能够实例化该类,但让它根据传递的类型处理 def。
我不确定如何在 scala 中处理这个问题,无论是基于宏的解决方案、重载方法还是为 Dao 定义的某种类型的隐式。任何方向将不胜感激!我不确定这是否是一个独特的问题,但我已经尽可能多地阅读了有关基于类型参数的编译时间定义,同时仍然能够引用相同的特征(在这种情况下是 DAO)
【问题讨论】:
-
尽管具有函数式编程结构,Scala 还允许我们以面向对象的方式进行编程,这似乎更接近于您已经在做的事情。您不认为这种行为应该封装在您的 Regular / Snap 特征而不是 DAO 中吗?
-
行为发生在 dao 中,类似于在此处插入,或在此处和此处插入。它不是 Regular 或 Snap 类可以理解或在其自身中定义的东西。
标签: scala generics scala-macros scala-2.12