2013-05-23 6 views
5

Utilizzando scala 2.10, sto provando a istanziare una classe da una stringa e vorrei ottenere il suo typetag.È possibile ottenere il tipoTag di un'istanza di runtime?

ad esempio:

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

questo sta lavorando:

scala> printClassName(new String()) 
String 

Ma non è questo:

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

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

C'è un modo per superare java cancellazione in fase di esecuzione con scala?

risposta

10

Credo che si possa usare la Scala Reflection api per ottenere lo Type (non TypeTag). Non sono sicuro se questo è ciò che volevi, ma è la stessa cosa che viene stampata in typeTag[Y].tpe.

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

Questo è esattamente quello che stavo cercando. Grazie mille! – itsu