我非常熟悉 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中的正确方法吗?因为我觉得我在为实现这一目标而与语言作斗争。