2011-11-19 2 views
3

J'améliore le support Scala dans Querydsl et j'ai rencontré le problème suivant. Voici un extrait de code qui illustre le problème:Problème de conversion implicite dans Scala

// framework types 
class RelationalPath[T] 
class RelationalPathAdapter[T, R <: RelationalPath[T]](p: R) { def someMethod = {} } 

// domain types 
class User 
class QUser extends RelationalPath[User] 

implicit def toAdapter[T, R <: RelationalPath[T]](p: R) = new RelationalPathAdapter[T,R](p) 

val path = new QUser() 

toAdapter(path).someMethod // DOESN'T COMPILE 

path.someMethod // DOESN'T COMPILE 

Comment faire correspondre un type dans une conversion implicite en plus de ses arguments de type. Je peux correspondre séparément, mais pas les deux.

Répondre

4

Dans ce cas précis, le changement suivant fonctionne:

implicit def toAdapter[T, R <: RelationalPath[T]](p: RelationalPath[T] with R) = 
    new RelationalPathAdapter[T,R](p) 
+0

Merci. Cela a effectivement fait l'affaire! –

3

Ce n'est pas vraiment un problème de conversion implicite plutôt un problème d'inférence de type. Quand vous appelez toAdapter (chemin), il n'y a rien d'implicite.

Si vous passez le paramètre de type, cela fonctionne.

toAdapter[User, QUser](path).someMethod 

Il peut même travailler avec une conversion implicite:

(path: RelationalPathAdapter[User, QUser]).someMethod 

mais bien sûr, cela est plutôt inutile.

La bonne façon d'écrire l'implicite est

implicit def toAdapter[T, R[X] <: RelationalPath[X]](p: R[T]) 
    = new RelationalPathAdapter[T, R[T]](p) 
+0

Cela ne semble pas fonctionner. Essayez ceci: val conv: RelationalPathAdapter [Utilisateur, QUser] = toAdapter (chemin) –

+0

Encore, il répond à votre question initiale, comme vous pouvez le faire 'path.someMethod'. Mais bon point, les informations sur 'QUser' sont perdues, vous avez seulement' RelationalPathAdapter [User, RelationalPath [User]] '. La solution d'Alexey, c'est alors. –

+0

Oui, ma question n'était pas assez explicite. Merci pour vos efforts cependant. –

Questions connexes