W.I.S. Laboratory
menu-bar

kotlin


kotlinでダックタイピングをしてみる

KotlinはJavaと同じようにジェネリックな関数を作れるので、どんな型でも受け取れる関数を作ることができる。
挙動もJavaと同じ動的ディスパッチという感じで、受け取る型の共通の親クラスまで遡ってその型にアップキャストして受け取る、という動きになるらしい。
なので何も継承していないユーザー定義型(自分で作ったクラスのインスタンス)をジェネリックメソッドで受け取ると、Any型まで遡ってしまうようだ。
結果、受け取ったジェネリック関数内では引数の型情報が失われてしまっているため、受け取ったオブジェクトのプロパティやメソッドにアクセスできないという厄介な状態になる 。
「どんなオブジェクトでも何でも来い」というメソッドは作れるのだが、受け取った後は「どこに何があるのか知らんけど」となってしまうのだ。

とはいってもさすがに自分が何クラスのインスタンスなのかという情報は残っているので、is演算子で元のクラスを逐一調べてはそれぞれの型にダウンキャストしてプロパティやメソッドにアクセスすれば、なんとかダックタイピングのような処理が書ける。
素直に同名メソッドを複数書いてオーバーロードするのとどちらがマシなのかはなんとも言えない感じ。


[ 戻る ]
saluteweb