因此,我希望有一个通用特征将一个类作为类型参数,该类具有从特定基类继承的伴随对象,并同时引用伴随对象和类本身。所以,
abstract class BaseModel[T] {
def all: Seq[T]
}
case class Customer(email: String, password: String)
object Customer extends BaseModel[Customer]
// This trait is my issue
trait BaseCrud[T] {
def table[T](f: T => String): String = {
T.all.map(f _).mkString("")
}
}
object Controller with BaseCrud {
def foo = table(_.email)
}
我有一些更接近该特征的解决方案,但我将其提炼出来,以便您可以看到我正在尝试做什么。
谢谢
更新
所以我从下面的弗兰克那里得到了解决方案,但我确实设法解决了我最初的难题。不过,在这种情况下,解决方案有点难看,为了完整起见,我将在此处包含它。
abstract class BaseModel[T] {
def all: Seq[T] = Seq()
}
case class Customer(email: String, password: String)
object Customer extends BaseModel[Customer]
trait BaseCrud[T, U <: BaseModel[T]] {
def table(f: T => String)(implicit obj: U): String = {
obj.all.map(f(_)).mkString("")
}
}
object Controller extends BaseCrud[Customer, Customer.type] {
implicit val model = Customer
def foo = table(_.email)
}
因此类型参数更改为 BaseCrud,隐式添加到 BaseCrud.table 并在 Controller.model 中实现。我还修正了我所有的错别字。我发现它很有趣 Customer.type 似乎是伴生对象的类型。