19.0503

Anyクラス

Anyクラスとは、Kotlin言語 におけるオブジェクトすべての、ご先祖様 です。
とりあえず、リファレンスを、参照してみましょう

open class Any   The root of the Kotlin class hierarchy.   Every Kotlin class has Any as a superclass.
つまり、すべてのKotlinオブジェクト の、ルーツ になります。
ためしに、is演算子 を使って、確認してみましょう。

こんなコードで試しました

IntelliJ先生に、ぶつぶつ言われましたが、
これは、臨機応変 という事で無視しました。
(いまさら言うまでもなく、ほとんど無視しています。でも、話だけは聞いておいた方がよさそうです。)
(日本語化もできるかもしれない、検索すればあるかもしれない)
(私は、コンピュータ用語、英語に慣れたいこともあって、無理して、英語で行きますが。)
出力結果のコメントに、「」 を、付けてないのは、省略してあるだけです。
ただ、分かりにくいかなと思ったものには、あえて付けました。


Anyクラス が持つ 3つのメソッド
Anyクラス には、3つの関数(メソッド) が、定義されています。

open operator fun equals(other: Any?): Boolean open fun hashCode(): Int open fun toString(): String

equals()
これは、
  ==
と、同じです。
  operatorキーワード が、付いていることが示しています。
    operatorキーワード かつ equals()という名前
  これが、== と、同じことを示しています。
    / これ以上の深い内容は、Kotlin イン アクション などで、調べる必要があります。
    / 入門レベル としては、「このことを知ってさえいればOK」 でしょう。

この、使い方に関しては、「5. いろいろな演算子」 に、あります。


hashCode()
すべての、オブジェクトに対して、適用できるのは、この3つのメソッド に、共通です。
意味があるかどうかはともかく、
  println(1.hashCode())
こんなコードでも、エラーなど発生しません。
大事なのは、
  equals() / == で、true を、返すには、
  この hashCode()メソッドが、返す、Int型の数値 が、一致していなければならない

というところです。
つまり、equals() を、override する時に、
単純に、データだけを比較するようにしても、
この点を押さえておかないと、ただしい、override とは、言えないのです。
  ここを、押さえておかないと、思わぬ不具合が発生する
ようです。
じつは、この難しい課題は、dataキーワード を、class に、
付けるだけで、解決します。
この点に関しては、「30. dataキーワード」 で、学習します。


toString()
これも、同様に、すべてのオブジェクトに対して、使えます。
そして、「そのオブジェクトを表現した 文字列」 で、返します。
返すのですが、扱いにくい文字列を、返すことがあります。
例えば、

class Car constructor()
fun main() { println(Car()) }

こんなコードでは、例えば、
  Car@30c7da1e
こんな結果を返します。

これに関しても、dataクラス が、サポートしています。



まとめ
・ Anyクラス は、Kotlin言語 における、すべてのオブジェクトの、ルーツである。
・ Anyクラスの3つのメソッド
   equals(引数はなんでも)
     return true/false
   hashCode()
     return 数値 (Int型)
   toString()
     return String