読者です 読者をやめる 読者になる 読者になる

オーバーロードの落とし穴

Java

にはまった。
Commons IO の org.apache.commons.io.filefilter 以下に存在するクラス群 が FileFilter も FilenameFilter も実装しているので、直接 new して File#listFiles に渡せない・・・


何でかって言うと、File#listFiles はオーバーロードされていて、

  • 引数を何も取らないメソッド
  • 引数に FileFilter を取るメソッド
  • 引数に FilenameFilter を取るメソッド

のうち、後ろ 2 つのどちらを使用するのか分からないから。
言いたいことは色々とあるけど、回避手段としては、

  • いったん FileFilter/FilenameFilter の変数に代入してから渡す
  • (FileFilter) new HogeFileFilter(...) みたいにキャストして渡す
  • static メソッドとして FileFilter asFileFilter(AbstractFileFilter) と FilenameFilter asFilenameFilter(AbstractFileFilter) 的な物を作って、それを介して渡す

のどれかを使うことになると思う。
うーん、AbstractFileFilter に FileFilter asFileFilter() と FilenameFilter asFilenameFilter() を用意してくれるのが一番ありがたいのだけれど・・・


いや、そもそも両方とも処理の中身はどうせ同じなんだよな・・・
なんでこんな似たインターフェイス作ったんだ!
せめて後から出来た FileFilter に FilenameFilter toFilenameFilter() なメソッドがあれば・・・!