2016-10-14 1 views
1

je reçoispauses polymorphisme Parametric lorsqu'un implicite devrait à Scala

Aucun Json sérialiseur trouvé pour le type T. Essayez de mettre en œuvre un ou Rédige Format implicite pour ce type.

dans

import play.api.libs.json._ 

trait A[T] { 
    def foo(t: T) = bar(Json.toJson(t)) 
} 

Je vais avoir un Writes pour le type de paramètre réel mais je ne vois pas que cela éclaircirait l'erreur de compilation. Après quelques recherches sur google, j'ai l'impression qu'il manque quelque chose de fondamental dans ma compréhension du sujet. Toute aide est appréciée.

+1

Je pense qu'il devrait être 'Json.toJson' Ai-je raison? – pamu

+0

@pamu oui, merci! modded il. – juanchito

Répondre

2

Le message d'erreur est pas très clair dans ce cas, vous n'avez pas besoin de mettre en œuvre un Writes pour ce type, il vous suffit de prouver au compilateur que vous avez un:

import play.api.libs.json._ 

trait A[T] { 
    def foo(t: T)(implicit w: Writes[T]) = bar(Json.toJson(t)) 
} 

Cette fonctionnera comme prévu. Vous pourriez également avoir un implicit def w: Writes[T] dans le trait, ce qui nécessiterait des instantiateurs pour fournir une instance, ce qui est plus restrictif dans la mesure où vous ne pouvez pas instancier un A sans une instance, mais c'est syntaxiquement un peu plus propre si vous avez beaucoup de méthodes comme Ceci, et vous voudrez peut-être que la restriction apparaisse plus tôt, plutôt qu'après que vous ayez déjà un A instancié et que vous essayiez d'appeler le foo dessus.

0

Fournir implicit def writes

import play.api.libs.json._ 

trait A[T] { 
    implicit def writes: Writes[T] 
    def foo(t: T) = bar(Json.toJson(t)) 
} 

ou fournissent des écritures comme implicit paramètre à foo

import play.api.libs.json._ 

trait A[T] { 
    def foo(t: T)(implicit writes: Writes[T]): JsValue = bar(Json.toJson(t)) 
} 
+0

Désolé, mais c'est faux - dans votre deuxième exemple, le 'T' de la méthode ombrera celui sur le trait, ce qui n'est jamais ce que vous voulez et peut conduire à des problèmes extrêmement confus. –

+0

@TravisBrown a édité la réponse. merci de suggérer – pamu

+0

Mais cela change complètement la sémantique du 'A' de l'OP. :) –