したがって、特定の基本クラスから継承するコンパニオン オブジェクトを持つクラスを型パラメーターとして取り、コンパニオン オブジェクトとクラス自体の両方を参照するジェネリック トレイトを作成したいと考えています。そう、
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 はコンパニオン オブジェクトの型のようです。