2008-10-10 17 views

Antwort

6

Hinweis: Diese Antwort ist veraltet!

Bitte siehe Antwort mit TypeTag für Scala 2.10 und oben

Darf ich #Scala auf 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

Die Jungs sind wirklich nett! – svrist

+1

ist es falsch. siehe Antwort zu Manifesten – Alexey

2

Bitte beachten empfehlen, dass dies nicht wirklich „das Ding : "

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

gibt

$ scala Test      
class scala.List 

Ich glaube, Sie diese auf Löschung verdenken

==== ==== EDIT Ich habe versucht, es mit einer Methode mit einem generischen Typparameter tun:

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

Und der Compiler akzeptiert es nicht. Typen sind keine Klassen ist die Erklärung

6

Es gibt eine neue, meist undokumentierte Funktion namens "Manifeste" in Scala; es funktioniert wie folgt:

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) 
} 

Die AnyRef gebunden gerade dort ist der Wert hat ein .toString Verfahren zu gewährleisten.

+0

Das scheint bei mir nicht zu funktionieren ohne den Wertparameter 't' – acjay

+0

Wenn Sie scala 2.10 und höher verwenden, können Sie' TypeTag' stattdessen verwenden. Siehe "TypeTag" -Antwort. – Julie

8

Verwenden Sie in Scala 2.10 und höher TypeTag, die vollständige Typinformationen enthält. Sie verlassen nun die scala-reflect Bibliothek enthalten, um brauchen, um dies zu tun:

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

Sie werden Ergebnisse erhalten wie folgt aus:

scala> printTheNameOfThisType[Int] 
Int 

scala> printTheNameOfThisType[String] 
String 

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