générique trait de prendre une classe et il est compagnon de l'objet en tant que paramètre de type

Donc je veux avoir un trait générique prendre comme un paramètre de type d'une classe avec un compagnon objet qui hérite d'une classe de base et de référence à la fois le compagnon de l'objet et la classe elle-même. Donc,

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)
}

J'ai eu quelques solutions à ce trait de caractère, qui ont été de plus près mais je distillée vers le bas de sorte que vous pouvez voir ce que je suis en train de faire.

Grâce

Mise à JOUR

Je suis donc allé avec la solution de Frank ci-dessous, mais j'ai réussi à résoudre mon premier puzzle. Bien que, dans ce cas, la solution était un peu moche, je vais l'inclure ici par souci d'exhaustivité.

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)
}

De sorte que le type des paramètres modifiés pour BaseCrud et l'implicite a été ajouté à BaseCrud.table et mis en œuvre dans le Contrôleur.de modèle. J'ai aussi corrigé toutes mes fautes de frappe. J'ai trouvé ça intéressant à la Clientèle.le type semble être le type de compagnon de l'objet.

OriginalL'auteur gimo4000 | 2012-05-09