JavaではすべてのクラスのスーパークラスはObjectですが、ScalaではAnyクラスがすべてのクラスのスーパークラスです。
Anyクラスには次のメソッドが定義されています。
// nullチェックをしてequalsを呼び出す。 final def ==(that: Any): Boolean final def !=(that: Any): Boolean // Javaのequalsと一緒 def equals(that: Any): Boolean // JavaのhashCodeと一緒 def hashCode: Int // 数値型とnull以外はhashCodeと同じ def ##: Int // JavaでもおなじみのtoString def toString: String
詳細はAPIドキュメントで。
http://www.scala-lang.org/api/current/index.html#scala.Any
AnyクラスはサブクラスにAnyRefクラスがあり、AnyRefクラスはJavaのObjectクラスの別名になっています。
ちなみにJavaの==であるeqはAnyRefクラスで定義されています。なのでAnyRefを継承していないプリミティブ(プリミティブはAnyRefではなくAnyValを継承しています)ではeqはありません。
scala> 1 eq 1 <console>:11: error: value eq is not a member of Int 1 eq 1 ^
プリミティブ
Scalaでは、整数をオブジェクトとして処理する必要がある場合に、自動でjava.lang.Integerに変換します。
たとえば1 toStringや、Any型の変数に代入しようとしたときなどです。
// Any型に入れるとjava.lang.Integer
scala> var a:Any = 1 a: Any = 1 scala> a.getClass res11: Class[_] = class java.lang.Integer // そのままだとInt scala> 1.getClass res12: Class[Int] = int
最下位(bottom)の二つの型
型階層の一番下に、scala.Nullとscala.Nothingクラスがあります。
scala.Nullクラスはすべての参照クラス(AnyRef)のサブクラスとして振る舞います。
参照クラスのサブクラスとして振る舞うので、値型(AnyVal)とは互換性はありません。
Nullクラスの値として、null値が存在します。
Nothing型はすべてのクラスのサブクラスとして振る舞います。
Nothing型には値はありません。
Nothing型の用途の一つはエラーを表すことです。
たとえば次のような例です。
def error(message: String): Nothing = throw new RuntimeException(message) def divide(x: Int, y: Int): Int = if (y != 0) x / y else error("can't divide by zero")
divideはIntを返す関数ですが、errorはNothingを返すと定義することでdivide関数内はもちろん他の型を返す関数内でつかうことができます。
No Comments