2013-06-09 3 views
3

Я пытаюсь использовать отражение 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

, но образцы, кажется, не охватывают этот случай, и я нахожу там обсуждение Среды, Вселенные и Зеркала трудно проникнуть. Кажется, что то, что я пытаюсь сделать, должно быть довольно простым, но, возможно, я совершенно не согласен с этим.

+0

вы не можете получить не-стертый типов от отражения без какой-либо информации времени компиляции (теги типа), так как только стираемые типы существуют во время выполнения на JVM, поэтому ответ @ tenshi - это лучшее, что вы можете сделать. Единственный способ выйти за рамки этого - сохранить тег типа для каждого элемента вашего массива в другой структуре данных вместе с этим. – gourlaysama

ответ

7

Наиболее очевидным решением было бы использовать класс:

def checkType[A](item: A) { 
    println("typeOf[A]: " + item.getClass) 
} 

Но если вы хотите работать с Type, то некоторые дополнительные работы необходимы:

def checkType[A](item: A) { 
    val mirror = runtimeMirror(this.getClass.getClassLoader) 
    println("typeOf[A]: " + mirror.classSymbol(item.getClass).toType) 
} 
+0

Спасибо, @tenshi, это полезно. Я на самом деле пытаюсь сделать это с помощью массивов. Я заметил, что ваше решение, похоже, возвращает стертые типы. Мне также нужно получить доступ к типу элемента массива. Я не уверен, есть ли легкое решение ... Я продолжу копать. –

Смежные вопросы