我非常熟悉 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);
}
和一个实现接口(interface)的类:
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 中的正确方法吗?因为我觉得我在某种程度上与语言作斗争来实现这一目标。
最佳答案
不,Java 不会那样做。
您需要执行以下操作:
public <T> void doQueryAndStoreData(
String query,
T storeIn,
ResultSetProcessor<T> processor
) {
或者更有可能:
public void doQueryAndStoreData(
String query,
ResultSetHandler handler // may contain processor and storeIn
) {
我希望我不需要提及 SQL 注入(inject)漏洞是一件坏事。 (此外,Map
不是 Java 中的 Collection
(它在 C# 中,但 C# Collection
不是很有用)。)
关于Java高阶多态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14506402/