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章でやるみたいですよー