コップ本をやる 第11章 Scalaの階層構造

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

Post a Comment

コメントを投稿するには、下の計算の答えを入力する必要があります。答えは半角数字で入力してください。 *