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]
