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 に答える