2016-01-29 3 views
0

Je sais que cela est possible:Réflexion sur les membres de type?

import scala.reflect._ 

trait Foo[A] 

def isDouble[A: ClassTag](foo: Foo[A]) = classTag[A].runtimeClass == classOf[Double] 

object Foo1 extends Foo[Double] 
object Foo2 extends Foo[String] 
assert(isDouble(Foo1)) 
assert(!isDouble(Foo2)) 

Mais, maintenant, je veux faire le A un type abstrait:

import scala.reflect._ 

trait Foo { 
    type A 
} 

def isDouble(foo: Foo): Boolean = ??? 

object Foo1 extends Foo {override type A = Double} 
object Foo2 extends Foo {override type A = String} 
assert(isDouble(Foo1)) 
assert(!isDouble(Foo2)) 

Comment implémenter la fonction isDouble?

Répondre

0

Scala, nous allons vous référer les arguments à la gauche d'une fonction cari (dans ce cas foo):

def isDouble(foo: Foo)(implicit ev: ClassTag[foo.A]) = classTag[foo.A].runtimeClass == classOf[Double]