使用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()
?
答案 0 :(得分:4)
x.args
为您提供该类型的类型参数。由于它们在运行时不可用,因此您会得到第一个案例的空列表,并且由于Int
没有任何类型参数,因此您也会得到一个空列表。您可以直接打印出符号。
println(reflect.runtime.currentMirror.reflect(thing).symbol)
这会产生
Value: List(42)
class ::
Value: 42
class Integer