मैं कार्यात्मक लैंगुग जैसे स्कीम और हास्केल से बहुत परिचित हूं। मैं जावा में एक समस्या को हल करने और संघर्ष करने की कोशिश कर रहा हूं, संभवतः क्योंकि मैं अभी भी एक कार्यात्मक मानसिकता में हूं।जावा हायर ऑर्डर पॉलीमोर्फिक फ़ंक्शन
मैं लिखना चाहते हैं:
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 */
}
}
ताकि पहली विधि कॉल कर सकते हैं उपयुक्त 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
लिख सकते हैं और मैं अपने ResultSet
में संग्रहीत करना चाहते हैं जो कुछ भी संग्रह प्रकार के लिए Storeable
उदाहरणों प्रदान कर सकता है।
इस जावा में सही दृष्टिकोण है? क्योंकि मुझे लगता है कि मैं इसे पूरा करने के लिए कुछ हद तक लंगेज से लड़ रहा हूं।
मुझे लगता है कि आपको विज़िटर पैटर्न - डबल प्रेषण का उपयोग करके हल करने के लिए क्या हल किया जा सकता है। – Scorpion
व्यक्तिगत रूप से, मैं एक समारोह से कुछ वापस करने के लिए और अधिक उपयुक्त होगा। कोड को और अधिक पठनीय बनाने के लिए जाता है। मानचित्र और सूची में निकटतम सुपरटेप के बारे में नहीं सोच सकते हैं, लेकिन यह वापसी मूल्य होगा, और फिर असाइनमेंट स्टेटमेंट में मानचित्र/सूची में डाला जाएगा, यानी, मानचित्र myMap = नया मानचित्र ; myMap = (मानचित्र ) प्रक्रिया (rset, myMap); " –
anthropomo