4

使用 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()

4

1 回答 1

4

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

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

这产生

Value: List(42)
class ::
Value: 42
class Integer
于 2012-09-18T10:13:47.647 回答