Java高阶多态函数

标签 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 */
}

界面如下:

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/

相关文章:

oop - VB6 中的多态行为

Python:带方法的高阶函数

function - Scala 函数定义参数列表上的不同括号样式

java - Hibernate 4.2.2 session 工厂错误

java - MongoDB 是否会复制具有相同数据的子文档?

java - 如何启用 RecyclerView 中的下一项?

c++ - 多态数据转换/转换设计模式

java - 在登录方法上同步代码

Java多态和向下转型

java - 修改匿名函数以在 Kotlin 中调用另一个匿名函数