Получение строкового представления типа во время выполнения в Scala - PullRequest
10 голосов
/ 10 октября 2008

В Scala возможно ли получить строковое представление типа во время выполнения? Я пытаюсь сделать что-то вроде этого:

def printTheNameOfThisType[T]() = {
  println(T.toString)
}

Ответы [ 4 ]

8 голосов
/ 02 июля 2015

В 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]
6 голосов
/ 25 декабря 2008

В 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.

6 голосов
/ 10 октября 2008

Примечание: этот ответ устарел!

Пожалуйста, смотрите ответ, используя TypeTag для Scala 2.10 и выше

Могу ли я порекомендовать #Scala на freenode

10:48 <seet_> /70192/poluchenie-strokovogo-predstavleniya-tipa-vo-vremya-vypolneniya-v-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.

Описание classOf

2 голосов
/ 12 октября 2008

Обратите внимание, что это не совсем "вещь:"

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

И компилятор не примет это. Типы не являются классами - это объяснение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...