2008-10-10 6 views

Répondre

6

Remarque: cette réponse est périmée!

S'il vous plaît voir la réponse à l'aide typetag pour Scala 2.10 et au-dessus

Puis-je recommander #Scala sur freenode

10:48 <seet_> http://stackoverflow.com/questions/190368/getting-the-string-representation-of-a-type-at-runtime-in-scala <-- isnt this posible? 
10:48 <seet_> possible 
10:48 <lambdabot> Title: Getting the string representation of a type at runtime in Scala - Stack Overflow, 
        http://tinyurl.com/53242l 
10:49 <mapreduce> Types aren't objects. 
10:49 <mapreduce> or values 
10:49 <mapreduce> println(classOf[T]) should give you something, but probably not what you want. 

+0

Les gars il y a vraiment sympa! – svrist

+1

c'est faux. voir la réponse à propos des manifestes – Alexey

2

S'il vous plaît noter que ce n'est pas vraiment « la chose : "

object Test { 
    def main (args : Array[String]) { 
    println(classOf[List[String]]) 
    } 
} 

donne

$ scala Test      
class scala.List 

Je pense que vous pouvez jeter le blâme sur l'effacement

==== ==== EDIT J'ai essayé de le faire avec une méthode avec un paramètre de type générique:

object TestSv { 
    def main(args:Array[String]){ 
    narf[String] 
    } 
    def narf[T](){ 
    println(classOf[T]) 
    } 
} 

Et le compilateur ne l'accepte pas. Les types arn't classes sont l'explication

6

Il existe une nouvelle fonctionnalité, la plupart du temps non documentée, appelée "manifestes" dans Scala; cela fonctionne comme ceci:

object Foo { 
    def apply[T <: AnyRef](t: T)(implicit m: scala.reflect.Manifest[T]) = println("t was " + t.toString + " of class " + t.getClass.getName() + ", erased from " + m.erasure) 
} 

Le AnyRef lié est juste là pour assurer la valeur a une méthode .toString.

+0

Cela ne semble pas fonctionner pour moi sans le paramètre value 't' – acjay

+0

Si vous utilisez scala 2.10 et supérieur, vous pouvez utiliser' TypeTag' à la place. Reportez-vous à la réponse 'TypeTag'. – Julie

8

Dans Scala 2.10 et versions ultérieures, utilisez TypeTag, qui contient des informations de type complet. Vous devrez inclure la bibliothèque scala-reflect afin de le faire:

import scala.reflect.runtime.universe._ 
def printTheNameOfThisType[T: TypeTag]() = { 
    println(typeOf[T].toString) 
} 

Vous obtiendrez des résultats comme ce qui suit:

scala> printTheNameOfThisType[Int] 
Int 

scala> printTheNameOfThisType[String] 
String 

scala> printTheNameOfThisType[List[Int]] 
scala.List[Int] 
Questions connexes