Я пытаюсь использовать отражение Scala 2.10, чтобы найти наиболее производный тип аргумента метода. Например, рассмотрим следующую программу:Использование отражения Scala для поиска наиболее производного типа времени исполнения
import reflect.runtime.universe._
object ReflectionTest {
def checkType[A : TypeTag](item: A) {
println("typeOf[A]: " + typeOf[A])
}
def main(args: Array[String]) {
val a = Array(1, "Hello")
for (item <- a) checkType(item)
}
}
Здесь a
имеет тип Array [Любой], чтобы каждый элемент направляется checkType
имеет тип Any. В результате checkType
выходы
typeOf[A]: Any
typeOf[A]: Any
Это имеет смысл для меня, так как TypeTag генерируется компилятором в точке вызова (где все это знает о типе, что это Any
). Однако я хочу определить фактический тип каждого элемента. Я хотел бы выход что-то вдоль линий
Int
String
Я просмотрел документацию здесь
http://docs.scala-lang.org/overviews/reflection/overview.html
, но образцы, кажется, не охватывают этот случай, и я нахожу там обсуждение Среды, Вселенные и Зеркала трудно проникнуть. Кажется, что то, что я пытаюсь сделать, должно быть довольно простым, но, возможно, я совершенно не согласен с этим.
вы не можете получить не-стертый типов от отражения без какой-либо информации времени компиляции (теги типа), так как только стираемые типы существуют во время выполнения на JVM, поэтому ответ @ tenshi - это лучшее, что вы можете сделать. Единственный способ выйти за рамки этого - сохранить тег типа для каждого элемента вашего массива в другой структуре данных вместе с этим. – gourlaysama