В Scala можно получить строковое представление типа во время выполнения? Я пытаюсь сделать что-то в этом направлении:Получение строкового представления типа во время выполнения в Scala
def printTheNameOfThisType[T]() = {
println(T.toString)
}
В Scala можно получить строковое представление типа во время выполнения? Я пытаюсь сделать что-то в этом направлении:Получение строкового представления типа во время выполнения в Scala
def printTheNameOfThisType[T]() = {
println(T.toString)
}
Пожалуйста, смотрите ответ, используя TypeTag для Scala 2.10 и выше
Могу ли я рекомендовать #Scala на 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.
Пожалуйста, обратите внимание, что это на самом деле не «вещь : "
object Test {
def main (args : Array[String]) {
println(classOf[List[String]])
}
}
дает
$ scala Test
class scala.List
Я думаю, что вы можете обвинить это на стирании
==== ==== EDIT Я пытался сделать это с помощью метода с родовым параметром типа:
object TestSv {
def main(args:Array[String]){
narf[String]
}
def narf[T](){
println(classOf[T])
}
}
И компилятор не примет его. Типы arn't classes - это объяснение
В Scala есть новая, в основном недокументированная функция, называемая «манифесты»; он работает так:
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)
}
AnyRef связаны только там, чтобы убедиться, что значение имеет метод .ToString.
В Scala 2.10 и выше используйте TypeTag
, которая содержит полную информацию о типе. Вам необходимо включить scala-reflect
библиотеку для того, чтобы сделать это:
import scala.reflect.runtime.universe._
def printTheNameOfThisType[T: TypeTag]() = {
println(typeOf[T].toString)
}
вы получите результаты, как следующее:
scala> printTheNameOfThisType[Int]
Int
scala> printTheNameOfThisType[String]
String
scala> printTheNameOfThisType[List[Int]]
scala.List[Int]
Ребята там очень приятно! – svrist 2008-10-10 09:00:02
это ложь. см. ответ о манифестах – Alexey 2010-04-25 15:19:46