私は、Scheme や Haskell などの関数型言語に精通しています。Java で問題を解決しようとして苦労していますが、これはおそらく私がまだ機能的な考え方をしているためです。
私は書きたい:
public void doQueryAndStoreData(String query, <? extends Collection> storeIn) {
/* make a jdbc query, get ResultSet */
ResultSet rset = ...;
ProcessResultSet proc = new ProcessResultSet();
proc.process(rset, storeIn);
/* clean up */
}
次のようなインターフェースを使用します。
private interface IProcessResultSet<C> {
public void process(ResultSet rset, C storeIn);
}
そして、次のようなインターフェースを実装するクラス:
private class ProcessResultSet implements IProcessResultSet<? extends Collection> {
public void process(ResultSet rset, Map storeIn) {
/* do something */
}
public void process(ResultSet rset, List storeIn) {
/* do something else */
}
}
process
最初のメソッドが、指定された型に基づいて適切なメソッドを呼び出すことができるようにしますstoreIn
。
Haskellで書くことができました
class Storeable c a where
store :: a -> c a -> c a
doQueryAndStoreData :: Storeable c a => ResultSet a -> c a -> c a
doQueryAndStoreData (ResultSet rs) coll = foldr store coll rs
Storeable
保存したいコレクションタイプのインスタンスを提供しますResultSet
。
これはJavaで正しいアプローチですか? これを達成するために言語と戦っているような気がするからです。