前章:基本


Scalaの型階層

  • Anyは全ての型のスーパータイプであり、トップタイプとも呼ばれる
    • equalshasCodetoStringなどの特定のユニバーサルメソッドが定義されている
    • AnyにはAnyValAnyRefの2つのサブクラスがある
  • AnyValは値型を表し、定義済みの値型は9個ある。それぞれの型はnullを許容しない
    1. Double
    2. Float
    3. Long
    4. Int
    5. Short
    6. Byte
    7. Char
    8. Unit
    9. Boolean
  • AnyRefは参照型を表し、値型以外の全ての型は参照型として定義される
    • ユーザー定義型はAnyRefのサブタイプ。また、ScalaがJVM上で実行される場合、AnyRefjava.lang.Objectに対応する

Tip

Scala.jsやScala Nativeではjava.lang.Objectが存在しないため、上記のような表現になっている

  • Anyはスーパータイプなので、List[Any]型には全ての要素を追加できる
val list: List[Any] = List(
	"a string", 
	732, // an integer
	'c', // a character
	true, // a boolean value 
	() => "an anonymous function returning a string"
) 
 
list.foreach(element => println(element))
// a string
// 732
// c
// true
// <function>

タイプキャスト

  • 値型は、以下の方向でキャストできる
  • Scalaの新しいバージョンでは精度の問題からLongからFloatへの型変換は非推奨になっている
val x: Long = 987654321
println(x)
val y: Float = x.toFloat
println(y) // 9.8765434E8 (note that some precision is lost in this case)
 
val face: Char = '☺'
val number: Int = face 
println(number) // 9786
  • 型変換は一方向で、下記はコンパイルできない
val x: Long = 987654321
val y: Float = x.toFloat
val z: Long = y  // Required: Long

Nothing and Null

  • Notihingは全ての型のサブタイプであり、ボトムタイプとも呼ばれる
    • 型を持つ値は存在せず、一般的な用途としては、例外の発生やプログラムの終了、無限ループが終わらない場合などを通知する場合が挙げられる
  • Nullは全ての参照型のサブタイプ
    • Nullはnullと言う単一を持つ
    • Nullは主に他のJVM言語との相互運用性のために提供されているので、Scalaではほとんど使用するべできはない

次章:クラス