2013-05-23 16 views
5

Korzystanie ze scala 2.10, Próbuję utworzyć instancję klasy z ciągu znaków i chciałbym uzyskać jej typetag.Czy można uzyskać typTag instancji środowiska wykonawczego?

na przykład:

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

to działa:

scala> printClassName(new String()) 
String 

Ale to nie jest:

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

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

Czy istnieje sposób, aby przezwyciężyć java skasowaniu przy starcie z Scala?

Odpowiedz

10

Wierzę, że możesz użyć apelu Scala Reflection, aby uzyskać Type (nie TypeTag). Nie jestem pewien, czy tego właśnie chciałeś, ale to samo jest drukowane w 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

To jest dokładnie to, czego szukałem. Dziękuję Ci bardzo! – itsu