Java高阶多态函数

cdk*_*cdk 7 java polymorphism higher-order-functions

我非常熟悉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 */
}
Run Code Online (Sandbox Code Playgroud)

使用如下界面:

private interface IProcessResultSet<C> {
    public void process(ResultSet rset, C storeIn);
}
Run Code Online (Sandbox Code Playgroud)

和一个实现接口的类,如:

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 */
    }
}
Run Code Online (Sandbox Code Playgroud)

这样第一种方法可以process根据storeIn给定的类型调用适当的方法.

在哈斯克尔,我可以写

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
Run Code Online (Sandbox Code Playgroud)

并为Storeable我想要存储的任何集合类型提供实例ResultSet.

这是Java中的正确方法吗?因为我觉得我在努力实现这一目标.

Tom*_*ine 2

不,Java 不这样做。

你需要做类似的事情:

public <T> void doQueryAndStoreData(
    String query,
    T storeIn,
    ResultSetProcessor<T> processor
) {
Run Code Online (Sandbox Code Playgroud)

或者更有可能:

public void doQueryAndStoreData(
    String query,
    ResultSetHandler handler // may contain processor and storeIn
) {
Run Code Online (Sandbox Code Playgroud)

我希望我不需要提及 SQL 注入漏洞是一件坏事。(也不MapCollectionJava 中的(它是 C# 中的,但 C#Collection不是很有用)。)