オーバーロードの落とし穴
にはまった。
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() なメソッドがあれば・・・!