2015-01-11 15 views
8

tpe yöntemini kullanarak Type numaralı telefonu TypeTag[A] numaralı telefondan edinebilirim. Ama tip etiketini de bir türden kurtarabilir miyim?Bir TypeTag türünden alın?

import scala.reflect.runtime.{universe => ru} 
import ru.{Type, TypeTag} 

def forward[A](implicit tt: TypeTag[A]): Type = tt.tpe 

def backward(t: Type): TypeTag[_] = ??? 

nedeni harita haline tuşları olarak tip-etiketlerini kullanan bir API olduğunu varlık, ancak bir noktada sadece tip ve etiket düştü.

+1

alakalı, muhtemelen yinelenen: http://stackoverflow.com/questions/11494788/how-to-create-a-typetag-manually –

+0

API artık değişti - böylece can 'TypeCreator' yerine' TypeFactory' yerine – dk14

cevap

7

mümkündür:

import scala.reflect.runtime.universe._ 
import scala.reflect.api 

val mirror = runtimeMirror(getClass.getClassLoader) // whatever mirror you use to obtain the `Type` 

def backward[T](tpe: Type): TypeTag[T] = 
    TypeTag(mirror, new api.TypeCreator { 
    def apply[U <: api.Universe with Singleton](m: api.Mirror[U]) = 
     if (m eq mirror) tpe.asInstanceOf[U # Type] 
     else throw new IllegalArgumentException(s"Type tag defined in $mirror cannot be migrated to other mirrors.") 
    }) 

assert(backward[String](forward[String]) == typeTag[String]) 
+0

'TypeCreator',' api' ve 'Universe'’nın geldiği yer? –

+0

Üzgünüm! Cevabı güncelledim. –

+0

Teşekkürler, işe yarıyor! –

İlgili konular