ジェネリックの特性は、特定の基本クラスを継承し、コンパニオンオブジェクトとクラスそのもの。だから、クラスとそのコンパニオンオブジェクトを型パラメータとして受け取るジェネリックな特性
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)
}
は私が近づいたことを特色にいくつかのソリューションを持っていたが、あなたは私が何をしようとしていますかを見ることができますので、私はそれを下に蒸留しました。
おかげ
UPDATE
は、だから私は、以下のフランクからの溶液で行きましたが、私は私の最初のパズルを解決するために管理しました。この場合、解決策は少し醜いですが、私は完全性のためにここに含めます。
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は、コンパニオンオブジェクトのタイプのようです。
おかげで作品が、私は私のBaseModel [T]は、コードの他の部分のためのCustomerオブジェクトに混入する必要があります。しかし、私はBaseCrud [T]からコントローラにアクセスするために同じコードでこのテクニックを使用しました。 – gimo4000