Scala で変数の型を見つける
 
この記事では、Scala で変数の型を見つける方法を説明します。 実行時に Scala で変数の型を取得するさまざまな方法を見てみましょう。
Scala でパターン マッチングを使用する
変数の型は常に Scala に存在し、パラメーターとして渡すことができます。
例:
def fun[T](data : T) = data
val x = 10
fun(x)
上記の例では、T が x の型である int であることがわかります。 しかし、実行時に int、string、double などの変数の型を取得するには、上記のコードを変更できます。
コード例:
object MyClass {
    def fun[T](data:T)= data match{
        case _:Int => "Int"
        case _:Double => "Double"
        case _:String => "String"
        case _ => "Undefined"
    }
    def main(args: Array[String]) {
     val x = 5.6
     val y = "hero"
     val z = 234
     println(fun(x))
     println(fun(y))
     println(fun(z))
    }
}
出力:
Double
String
Int
Scala で getClass メソッドを使用する
Scala の getClass メソッドは、Scala オブジェクトのクラスを取得するために使用されます。 このメソッドを使用して、変数の型を取得できます。
コード例 1:
object MyClass {
    def main(args: Array[String])
    {
    val x = 123;
    System.out.println(x.getClass)
    val y = "hero"
    System.out.println(y.getClass)
    val z = 34.56
    System.out.println(z.getClass)
    }
}
出力:
int
class java.lang.String
double
上記の出力は、文字列に関しては java.lang.String を出力することを示しています。これは、Scala 文字列は java.lang.String の wrapper にすぎないためです。
したがって、java.lang.String の代わりに、より意味のある出力を持つ String が必要な場合は、getSimpleName と getClass メソッドを使用できます。
コード例 2:
object MyClass {
    def main(args: Array[String])
    {
    val y = "hero"
    System.out.println(y.getClass.getSimpleName)
    }
}
出力:
String
Scala で Manifest を使用する
Manifest は Scala の機能です。 ランタイム コンパイラでこれを使用すると、generic 型情報を取得できます。 Scala では、型パラメーターを使用してインスタンスを作成できます。たとえば、def fun[T](data:T)= dataです。 ここで、T は型パラメーターです。
したがって、型 Manifest[T] のオブジェクトを作成することで、型 T に関する完全な情報を取得できます。
コード例:
object MyClass {
def myFunc[T: Manifest](t: T): Manifest[T] = manifest[T]
    def main(args: Array[String])
    {
    val y =123
    println(myFunc(y))
    }
}
出力:
Int
Manifest を使用する主な利点の 1つは、変数が List や Sequence などであるかどうかなど、非プリミティブ型の型を見つけることです。
コード例 2:
object MyClass {
def myFunc[T: Manifest](t: T): Manifest[T] = manifest[T]
    def main(args: Array[String])
    {
    val y = List(1,2,3,4)
    val z = Seq("apple","mango")
    println(myFunc(y))
    println(myFunc(z))
    }
}
出力:
scala.collection.immutable.List[Int]
scala.collection.immutable.Seq[java.lang.String]
