【发布时间】:2013-01-24 16:44:13
【问题描述】:
我非常熟悉 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 */
}
}
这样第一个方法可以根据给出的storeIn 的类型调用适当的process。
我可以在 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
并为我想在其中存储ResultSet 的任何集合类型提供Storeable 实例。
这是 Java 中的正确方法吗?因为我觉得我在与语言作斗争来实现这一点。
【问题讨论】:
-
我认为您需要的可以使用访问者模式来解决 - 双重调度。
-
就个人而言,我更倾向于从函数中返回一些东西。倾向于使代码更具可读性。想不出最接近 Map 和 List 的超类型,但那将是返回值,然后在赋值语句中强制转换为 Map/List,即 `Map
myMap = new Map ; myMap = (Map ) process(rset, myMap);"
标签: java polymorphism higher-order-functions