10-8. Any クラス
概要
クラスの継承ができることは、前の節までに記載してきました。
このクラスの継承の階層のルートとなるのが 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