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中的正确方法吗?因为我觉得我在努力实现这一目标.
不,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 注入漏洞是一件坏事。(也不Map是CollectionJava 中的(它是 C# 中的,但 C#Collection不是很有用)。)
| 归档时间: |
|
| 查看次数: |
360 次 |
| 最近记录: |