Functional Programming in ScalaのWikiを翻訳している中で path-dependent types という単語が出てきてよくわからなかったので調べました。 調べたらhishidamaさんのページが出てきてくれたので良かった(?)です。 詳細はそちらを参照していただければという感じなんですが、以下一応自分なりに噛み砕いてまとめてみました。

経路依存型(path-dependent types)

普通にJavaで内部クラスを定義したとすると、以下のような感じになると思います。Scalaでも同様に書けると思います。

さてここから先、内部クラスのインスタンスを生成したときの挙動がJavaとScalaで変わるそうです。 まずはJavaの例を見てみましょう。

Javaでは class A の異なるインスタンスa1, a2を用いて、それぞれの内部クラス B のインスタンスを生成したとしても、それらは同じ型です。 つまり以下のようなことができるはずです。

しかしながらScalaで同様のことをやってみるとうまくいかないのです(やったことがなかったので気づかなかった!)。

また生成元の class A が同じインスタンスであっても、生成経路が異なると違う型として扱われるらしいです(これは驚きました)。

したがって同じ経路で生成された内部クラスのインスタンス同士の型でないと同じ型として認識されません。 くどいようですが、コードで示すと以下のような具合になります。

なるほどなぁ…って感じです。ちなみにパス依存で異った型として扱われている内部クラスを同じクラスとして扱いたかったら、外側のクラス名#内部クラス名にキャストすれば良いようです。勉強になりました…。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です