2010-11-23 6 views
4

J'expérimente avec des variables implicites dans mon code Scala. J'ai écrit l'exemple de code suivant mais malheureusement, il ne parvient pas à compiler. Je me demandais, est-ce que quelqu'un sait ce qui manque ici? (En utilisant scala 2.8.0 avec SBT 0.7.4 sur linux)Scala, accédant à la classe de type abstrait dans un trait

Merci, Ali

trait Feed 
trait FeedFactory { 
type T <: Feed 
implicit val op_name = classOf[T].getCanonicalName  
def create():T 
def destroy(op:T) 
} 

Error: class type required but FeedFactory.this.T found  
implicit val op_name = classOf[T].getCanonicalName 

Répondre

5

type T est oublié au moment de la compilation (voir l'effacement de type). Mais scala offre Manifest s qui conservent le type grâce à la compilation.

Voici un exemple plus complet: explanation.

+0

Merci, je l'ai corrigé avec implicite val op_name = { def op_name [T] (implicite m: scala.reflect.Manifest [T]) = {m.getClass.getCanonicalName}; op_name} mais je trouve que ça a l'air un peu moche, comme j'ai besoin de définir une variable implicite, est-ce qu'il y a une meilleure façon de faire ça? –

+1

@Ali avec scala 2.8, vous devriez pouvoir utiliser 'def op_name [T: Manifest] = implicitement [Manifest [T]]. GetClass.getCanonicalName' – shellholic

+0

Ali votre solution ne fonctionne pas. Il retourne toujours rien. Vous devriez probablement écrire val op_name = {def op_name [T] (m implicite: scala.reflect.Manifest [T]) = {m.getClass.getCanonicalName}; op_name [T]} et indique error: No Manifest disponible pour X.this.T –

Questions connexes