我对功能语言非常熟悉,例如Scheme和Haskell。我试图解决Java中的一个问题并且挣扎,可能是因为我仍然处于功能性思维模式。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正确的做法?因为我觉得我有点为了达到这个目的而与语言作斗争。
我认为你需要什么可以使用访问者模式来解决 - 双调度。 – Scorpion
个人而言,我更倾向于从函数中返回某些东西。倾向于使代码更具可读性。无法想象与Map和List最接近的超类型,但这将是返回值,然后在赋值语句中将其转换为Map/List,即“Map myMap = new Map ; myMap =(地图)process(rset,myMap);“ –
anthropomo