Scala 2.10反射:为什么列表和列表元素的类型为“List()”?

时间:2012-09-18 09:42:06

标签: scala scala-2.10

使用scala-2.10.0-M7,请考虑以下Scala程序:

import reflect.runtime.universe._

object ScalaApplication {
  def main(args: Array[String]) {
    val list = List(42)
    printValueAndType(list)
    printValueAndType(list(0))

  }

  def printValueAndType (thing: Any) {
    println("Value: " + thing)
    println(reflect.runtime.currentMirror.reflect(thing).symbol.toType match {case x:TypeRef => "Type: " + x.args});
  }

}

它提供以下输出:

$ scala ScalaApplication.scala 
Value: List(42)
Type: List()
Value: 42
Type: List()

为什么list的类型与list(0)的类型相同?

我本来期望类似于以下Java程序的行为:

public class JavaApplication {
    public static void main(String[] args) {

        Integer[] list = new Integer[]{42};

        printValueAndType(list);
        printValueAndType(list[0]);

    }

    public static void printValueAndType(Object o) {
        System.out.println("Value: " + o.toString());
        System.out.println("Type: " + o.getClass().getSimpleName());
    }

}

结果如下:

$ java JavaApplication
Value: [Ljava.lang.Integer;@16675039
Type: Integer[]
Value: 42
Type: Integer

总结: 为什么list和list元素的类型都报告为List()

1 个答案:

答案 0 :(得分:4)

x.args为您提供该类型的类型参数。由于它们在运行时不可用,因此您会得到第一个案例的空列表,并且由于Int没有任何类型参数,因此您也会得到一个空列表。您可以直接打印出符号。

println(reflect.runtime.currentMirror.reflect(thing).symbol)

这会产生

Value: List(42)
class ::
Value: 42
class Integer