2015-01-11 2 views
8

tpe विधि का उपयोग करके TypeTag[A] से मुझे Type मिल सकता है। लेकिन क्या मैं एक प्रकार से टाइप-टैग भी पुनर्प्राप्त कर सकता हूं?एक प्रकार से टाइपटाग प्राप्त करें?

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[_] = ??? 

कारण यह है कि मैं एक एपीआई, नक्शे में कुंजी के रूप में प्रकार टैग का उपयोग करता है, लेकिन कुछ बिंदु पर मैं केवल प्रकार है और टैग गिरा दिया।

+1

प्रासंगिक, संभवतः नकल: http://stackoverflow.com/questions/11494788/how-to-create-a-typetag-manually –

+0

एपीआई अब बदल गया है - तो आप कर सकते हैं 'TypeFactory' – dk14

उत्तर

7

यह संभव है:

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

के बजाय 'टाइप क्रिएटर' कार्यान्वयन पास करें जहां 'टाइप क्रिएटर', 'एपीआई' और 'यूनिवर्स' कहां से आते हैं? –

+0

क्षमा करें! मैंने जवाब अपडेट कर लिया है। –

+0

धन्यवाद, यह काम करता है! –

संबंधित मुद्दे