मेरे पास एक कन्डर्रम है जिसने मुझे इस बात पर विचार करने के लिए प्रेरित किया है कि Collection<T>
को लागू किए बिना Iterable<T>
लागू करने वाले मानक मानक क्लास हैं या नहीं। मैं एक इंटरफ़ेस को कार्यान्वित कर रहा हूं जिसके लिए मुझे Iterable<T>
स्वीकार करने वाली विधि को परिभाषित करने की आवश्यकता है, लेकिन इस विधि को वापस करने के लिए मैं जिस ऑब्जेक्ट का उपयोग कर रहा हूं उसे Collection<T>
की आवश्यकता है।क्या कोई जावा मानक वर्ग है जो संग्रह को लागू किए बिना इटरबल लागू करता है?
यह मुझे कुछ वास्तव में क्लूजी महसूस करने वाला कोड कर रहा है जो संकलित होने पर कुछ अनचेक चेतावनियां देता है।
public ImmutableMap<Integer, Optional<Site>> loadAll(
Iterable<? extends Integer> keys
) throws Exception {
Collection<Integer> _keys;
if (keys instanceof Collection) {
_keys = (Collection<Integer>) keys;
} else {
_keys = Lists.newArrayList(keys);
}
final List<Site> sitesById = siteDBDao.getSitesById(_keys);
// snip: convert the list to a map
अधिक generified Collection<? extends Integer>
प्रकार का उपयोग करने के लिए कि लाइन के लिए अनियंत्रित चेतावनी को समाप्त नहीं करती मेरी जिसके परिणामस्वरूप संग्रह बदल रहा है। साथ ही, मैं Iterable
के बजाय Collection
को स्वीकार करने के लिए विधि हस्ताक्षर नहीं बदल सकता क्योंकि तब यह सुपर विधि को ओवरराइड नहीं कर रहा है और आवश्यकता होने पर कॉल नहीं किया जाएगा।
वहां doesn't seem to be a way around इस कास्ट-या-कॉपी समस्या: अन्य प्रश्न यहां कहीं और पूछे गए हैं और यह जावा के जेनेरिक और टाइप एरर सिस्टम में गहराई से दिखता है। लेकिन मैं इसके बजाय पूछ रहा हूं कि क्या कोई कक्षाएं हैं जो Iterable<T>
को कार्यान्वित कर सकती हैं जो Collection<T>
को भी लागू नहीं करती हैं? मैंने Iterable
JavaDoc के माध्यम से एक नज़र डाली है और निश्चित रूप से जो कुछ भी मैं अपने इंटरफ़ेस में पारित होने की अपेक्षा करता हूं वह वास्तव में एक संग्रह होगा। मैं इसके बजाय एक जंगली, पूर्व-लिखित कक्षा का उपयोग करना चाहता हूं क्योंकि वास्तव में पैरामीटर के रूप में पारित होने की अधिक संभावना होती है और इकाई परीक्षण को और अधिक मूल्यवान बना देता है।
मुझे यकीन है कि मैंने जो कुछ यूनिट परीक्षण लिख रहे हैं, उसके कारण मैं अपने प्रोजेक्ट में उपयोग किए जाने वाले प्रकारों के साथ काम करता हूं। लेकिन मैं कुछ इनपुट के लिए एक यूनिट टेस्ट लिखना चाहता हूं कि एक पुनरावृत्त अभी तक संग्रह नहीं है और अब तक मैं सभी के साथ आने में सक्षम हूं, जो मुझे डमी-टेस्ट क्लास कार्यान्वयन को कार्यान्वित कर रहा है।
उत्सुक के लिए, विधि कार्यान्वयन के लिए मैं कर रहा हूँ अमरूद के CacheLoader<K, V>.loadAll(Iterable<? extends K> keys)
है और समर्थन विधि एक JDBI instantiated डेटा का उपयोग वस्तु है, जो एक संग्रह की आवश्यकता है @BindIn
इंटरफेस के लिए पैरामीटर प्रकार के रूप में इस्तेमाल किया जा रहा है। मुझे लगता है कि मैं सोचने में सही हूं कि यह सवाल के लिए स्पर्शपूर्ण है, लेकिन अगर कोई मेरी समस्या पर पार्श्व सोचने की कोशिश करता है। मुझे पता है मैं सिर्फ JDBI परियोजना कांटा और @BindIn
एनोटेशन पुनर्लेखन एक iterable स्वीकार करने के लिए कर सकता है हूँ ...
अपने शीर्षक में सवाल का जवाब करने के लिए। – aioobe
एक प्रतिलिपि बनाने में क्या गलत है- यानी, नया संग्रह बनाना? आप केवल नई वस्तुओं को नहीं बनाते, संदर्भों की प्रतिलिपि बनायेंगे। – VGR
कुछ भी गलत नहीं है, लेकिन मैं किसी भी आवंटन से बचने के लिए एक रास्ता तलाश रहा था। जैसा कि नाम का तात्पर्य है, ['Lists.newArrayList'] (http://grepcode.com/file/repo1.maven.org/maven2/com.google.guava/guava/r06/com/google/common/collect/Lists .java # Lists.newArrayList% 28java.lang.Iterable% 29) संभावित रूप से 'लॉग (n)' बार आवंटित कर सकते हैं क्योंकि यह बैकिंग सरणी आवंटित करने से पहले आकार नहीं मिलता है। (हालांकि फिर से गुवा कोड को देखते हुए, मुझे बस एहसास हुआ कि मेरा अपना 'उदाहरण तब कास्ट' अनावश्यक है।) –