LL脳がscalaの勉強を始めたよ その34


Scalaコップ本の11章に突入しますよー、11章ではScalaのクラス階層構造についてですねー

Scalaのクラス構造

クラスの階層構造の模式図はコップ本のP196を参照ください

…ってだけでもあれなので、適当にまとめていきますよ

Anyクラス

Scalaのクラス構造の頂点はAnyクラスになるので、その他すべてのクラスはAnyクラスを継承することになるのデス。ちなみにAny 型は次のようなメソッドを持っておりますねー

// ==と!=はfinal宣言されているのでオーバーライドできませんね
final def == (that:Any):Boolean
final def != (that:Any):Boolean
// こいつらはオーバーライドできますね
def equals(that:Any):Boolean
def hashCode:Int // ハッシュ値計算用らしいデス
def toString:String

equalsは==と同じ意味で!=と逆の評価になるので、各クラスではこいつをオーバーライドして==, !=的な意味を持たせるそうデス。まあ各クラスの==, !=がequalsって解釈になるでしょうかねー

ちなみにAnyクラスはAnyValとAnyRefの2つのサブクラスを持ってますねー

AnyValクラス

AnyValクラスはScalaの組み込みの値クラスの親クラスみたいで、サブクラスとなる値クラスは次の9つありますね

  • Byte
  • Short
  • Char
  • Int
  • Long
  • Float
  • Double
  • Boolean
  • Unit

最初の8つはJava的プリミティブ型に対応してUnit型はJava的void型に対応する人のことです

ちなみにScalaの値型は抽象クラスにしてファイナルクラスというトリッキーな構成みたいですねー

scala> new Int                  
// 抽象クラスだ!と怒られました(´・ω・`)
<console>:5: error: class Int is abstract; cannot be instantiated
       new Int
       ^

あと、値クラスは算術演算と論理演算メソッドをサポートしてるらしいですね。Intなんかの+や*とか、Booleanの||とか&&ですな

暗黙の型変換

AnyValクラスのサブクラスである値クラスはそれぞれ暗黙の型変換が定義されているみたいです。

例えば次のような感じ型変換できるみたいです

Byte → Short → Int  → Long  → Float  →  Double

Char → Int
<<

また、5章でやったとおり暗黙の型変換は値型に機能を追加するのにも使われておりますねー、例えば下のようなIntからscala.runtime.RichInt型への暗黙の型変換もそうですねー
>|scala|
// Int型からRichInt型に暗黙の型変換で機能追加します

// 大きい方を取り出しますよ
scala> 36 max 32
res3: Int = 36
// 小さい方をとりだしますよ
scala> 36 min 32
res4: Int = 32

// ソースからターゲット未満までの範囲を取り出しますよ
scala> 1 until 9
res5: Range = Range(1, 2, 3, 4, 5, 6, 7, 8)
// ソースからターゲットまでの範囲を取り出しますよ
scala> 1 to 5
res6: Range.Inclusive = Range(1, 2, 3, 4, 5)

// 絶対値
scala> 4.abs 
res7: Int = 4
scala> (-4).abs
res8: Int = 4

上記観たいな「ブースタークラス」(RichIntみたいなの?)については21章でやるみたいですよー

AnyRefクラス

AnyRefクラスはScalaの参照クラスの基底らしいデス。つまり利用者(一般開発者)が作成するクラスはAnyRefを継承している…と解釈できそうですね。

JVM上ではjava.lang.ObjectとAnyRefは交換可能みたいですけど、AnyRefが推奨みたいですね

あとScalaのクラスはScalaObjectというトレイトも継承している人のことです…トレイトについては12章でやるっすね(`・ω・´)ちなみにScalaObjectには現時点でパターンマッチ高速化のための$tagメソッドが含まれているそうです(いまのところ、これだけとのこと)

いじょー

とりあえず今回はここまでー、次回だけで11章終われればいいなぁ…が、頑張ります