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
Vous devez vous connecter pour publier un commentaire.
Il y a un tas de problèmes dans votre code.., nous allons aborder l'un après l'autre:
def table[T](...
noter que cetteT
remplace le type d'origine des paramètres du champ d'application de la méthode. Pas ce que vous voulez vraiment, il suffit donc de le supprimer et de faire de cettedef table(...
object Controller with BaseCrud {
contient deux erreurs:extends
paswith
. Ce dernier est utilisé seulement après que vous avez déjà prolongé de certains de la classe de base/trait.BaseCrud
nécessite un type de paramètre que vous ayez à préciser ici, donc quelque chose commeBaseCrud[Customer]
T
et un compagnon objet. Ils sont par nature des choses différentes, de sorte que vous ne peut pas accéder à la compagne de l'objet viaT.something
. Au lieu de cela, vous devez fournir le compagnon objet dans votre trait d'une autre manière, par exemple comme un domaine abstrait.Voici une version de ce que je crois que vous voulez faire:
OriginalL'auteur Frank
Je pense que vous pouvez utiliser scala
self
type dansBaseCrud
trait à spécifier une classe, il doit être mélangé dans. Voir lié à la question pour plus de détails.OriginalL'auteur 4e6