3

Scala 2.10 リフレクションを使用して、メソッド引数の最も派生した型を見つけようとしています。たとえば、次のプログラムを考えてみましょう。

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[Any] 型があるため、送信される各アイテムcheckTypeの型は Any になります。その結果、checkTypeアウトプット

typeOf[A]: Any
typeOf[A]: Any

TypeTag は呼び出しの時点でコンパイラによって生成されるため、これは私には理にかなっています (型について知っているのは、それが であるということだけですAny)。しかし、私が望むのは、各アイテムの実際のタイプを決定することです。次の行に沿って何かを出力したい

Int
String

ここでドキュメントを調べました

http://docs.scala-lang.org/overviews/reflection/overview.html

しかし、サンプルはこのケースをカバーしていないようで、Environment、Universe、Mirror の議論は理解しにくいと思います。私がやろうとしていることはかなり単純なはずですが、おそらく私は完全に間違っています。

4

1 に答える 1

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)
}
于 2013-06-09T13:56:24.000 に答える