※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

10-8. Any クラス

2023年10月9日

概要

クラスの継承ができることは、前の節までに記載してきました。
このクラスの継承の階層のルートとなるのが Any クラスです。すなわち、すべてのクラスのスーパークラス・親クラスが Any クラスとなり 、明示的に指定しなくても Any クラスを継承しています。
(正確には、すべての null非許容クラスのルートが Any クラスです。)

Any クラスの特徴

Anyクラスの継承は省略可能

クラスを定義する際に、継承元のクラスを記述しなかった場合、自動的に Any クラスを継承したことになります。
Any クラスがスーパークラスであることを明記しても問題ありません。

例えば、ここまでの節で記載してきた Person クラスに関しては以下のように記述することが可能です。

open class Person (var name : String = "", var age : Int = 0) : Any() {  
    open fun greeting(){
        println("Hello World! 私は ${name} です。年齢は ${age} 才です。")
    }
}
fun main(){
    val myPersonObj : Person = Person("HogeHoge", 3)
    myPersonObj.greeting()
}

Any クラスで定義されているメソッドは 3つ

Any クラスでは、以下の 3つのメソッドが定義されています。

  • equals
  • hashCode
  • toString

すべてのクラスは Any クラスを (自動的に) 継承するので、これらのメソッドが利用できることを意味します。

equals 関数

▼ 定義部分

open operator fun equals(other: Any?): Boolean

▼ 説明

他のオブジェクトがこのオブジェクトと「等しい」かどうかを示します。
必要に応じて、サブクラスでオーバーライドして、独自の等価性比較ロジックを実装できます。

実装は次の要件を満たす必要があります。

  • 再帰的: null 以外の値 x に対して、x.equals(x) は true を返す必要があります。
  • 対称: null 以外の値 x および y については、y.equals(x) が true を返す場合に限り、x.equals(y) は true を返す必要があります。
  • 推移的: null 以外の値 x、y、z について、x.equals(y) が true を返し、y.equals(z) が true を返す場合、x.equals(z) は true を返す必要があります。
  • 一貫性: オブジェクトの等号比較で使用される情報が変更されていない限り、null 以外の値 x および y について、x.equals(y) を複数回呼び出しても一貫して true が返されるか、一貫して false が返されます。
    null と等しくない: null 以外の値 x に対して、x.equals(null) は false を返す必要があります。

hashCode

▼ 定義部分

open fun hashCode(): Int

▼ 説明

オブジェクトのハッシュ コード値を返します。 hashCode の一般規約は次のとおりです。

  • 同じオブジェクトに対して複数回呼び出されるときは常に、オブジェクトの等号比較で使用される情報が変更されていない限り、hashCode メソッドは一貫して同じ整数を返す必要があります。
  • equals() メソッドに従って 2 つのオブジェクトが等しい場合、2 つのオブジェクトのそれぞれに対して hashCode メソッドを呼び出すと、同じ整数の結果が生成される必要があります。

toString

▼ 定義部分

open fun toString(): String

▼ 説明

オブジェクトの文字列表現を返します。

  • のオブジェクトの文字列表現を返します。
  • デフォルトでは、クラス名とハッシュコードを含む文字列を返します。
  • 必要に応じて、サブクラスでオーバーライドして、独自の文字列表現を提供できます。

Any クラスの利用

Any クラスは、型パラメータとして使用することで、 任意の型のオブジェクトを受け取ることができる関数を定義する際に役立ちます。

以下の例では、printAnything() 関数は Any 型のパラメータを受け取ることができるため、 任意の型のオブジェクトを引数として渡すことができます。

class Person (var name : String = "", var age : Int = 0) {
    fun greeting(){
        println("Hello World! 私は ${name} です。年齢は ${age} 才です。")
    }
}

fun printAnything(obj: Any) {
    println(obj.toString())
}

fun main() {
printAnything("Hello") // 出力: Hello
printAnything(123) // 出力: 123
printAnything(Person("花子", 18)) // 出力: Person@ハッシュコードの値
}

出力

Hello
123
Person@3d494fbf

公式サイトの情報

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/

https://github.com/JetBrains/kotlin/blob/7a7d392b3470b38d42f80c896b7270678d0f95c3/core/builtins/native/kotlin/Any.kt