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()
なぜですか?