2013-05-23 5 views
5

Mit scala 2.10 versuche ich, eine Klasse aus einer Zeichenkette zu instanziieren, und ich möchte sein typetag bekommen.Kann der TypTag einer Laufzeitinstanz abgerufen werden?

zum Beispiel:

scala> def printClassName[Y: TypeTag](x: Y) = { println(typeTag[Y].tpe) } 
printClassName: [Y](x: Y)(implicit evidence$1: reflect.runtime.universe.TypeTag[Y])Unit 

dies funktioniert:

scala> printClassName(new String()) 
String 

Aber das ist nicht:

scala> var foo = Class.forName("java.lang.String") 
myInstance: Class[_] = class java.lang.String 

scala> printClassName(foo) 
java.lang.Class[?0] 

Gibt es eine Möglichkeit Java-Löschung zur Laufzeit mit scala zu überwinden?

Antwort

10

Ich glaube, Sie können die Scala Reflection API verwenden, um die Type (nicht TypeTag) zu erhalten. Nicht sicher, ob dies das ist, was Sie wollten, aber es ist dasselbe, das in typeTag[Y].tpe gedruckt wird.

import scala.reflect.runtime.universe._ 
val m = runtimeMirror(getClass.getClassLoader) 
val classSymbol = m.staticClass("java.lang.String") 
val tpe = classSymbol.selfType 
+0

Dies ist genau das, was ich gesucht habe. Vielen Dank! – itsu