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]