2011-10-14 14 views
9

स्प्रिंग बैच का ItemWriter इंटरफ़ेस यह है:सूची कैसे डालें <? fz><Foo> सूचीबद्ध करने के लिए विस्तारित करता है

write(List<? extends T> items); 

मैं आइटमवाइटर को एक सेवा कॉल करना चाहता हूं लेकिन मेरी सेवा में यह है:

process(List<T> items); 

AFAIK, जावा जेनिक्स संग्रह के भीतर कास्टिंग प्रकारों के बारे में सख्त हैं ।

+0

के एक जवाब में समझाया गया है क्यों आपकी सेवा 'प्रक्रिया (सूची आइटम) है है' और नहीं 'प्रक्रिया (सूची आइटम) '? – ILMTitan

+1

क्योंकि यही वही है जो मैं चाहता हूं। मुझे स्प्रिंग कहने का पालन करने की ज़रूरत नहीं है। – pritam

+0

आप ऐसा क्यों चाहते हैं? क्या आप तत्वों में तत्वों को सम्मिलित कर रहे हैं (केवल एक कार्यक्षमता जिसे आप इसे वाइल्डकार्ड बनाकर खो देंगे)? – ILMTitan

उत्तर

9

बस आगे जाना है और यह डाली। पढ़ने के लिए, List<? extends Foo> निश्चित रूप से List<Foo> है, कास्ट बिल्कुल सुरक्षित है। यदि आप पागल हैं तो आप Collections.unmodifiableList() के साथ इसे लपेट सकते हैं।

List<? extends Foo> foos1 = ...; 

@SuppressWarnings("unchecked") 
List<Foo> foos2 = (List<Foo>)(List<?>)foos1;  
+1

शानदार। आप भगवान हैं पीएस: ध्यान दें क्यों जावा जेनरिक SUCK। – pritam

+3

अतिरिक्त (सूची ) कास्ट क्यों? –

+0

यह काम नहीं कर रहा है –

2

यदि आपकी सेवा ? extends T की अनुमति देती है, तो यह वही होना चाहिए। वर्तमान में, यह कहता है कि क्या पारित किया गया है वास्तव में T होना चाहिए।

+0

वह स्पष्ट रूप से कहता है कि सेवा सूची स्वीकार करती है, सूची नहीं। –

7

सुनिश्चित करें कि आपकी विधि टी से विरासत प्राप्त करने वाली वस्तु प्राप्त करती है, और उसके बाद एक कलाकार का प्रदर्शन करती है।

या लिखने की विधि के बराबर होने के लिए अपनी विधि के हस्ताक्षर को बदलें।

+0

मुझे वसंत के लिए अपने हस्ताक्षर क्यों बदलना चाहिए? नहीं। – pritam

+1

मैंने कहा कि मुझे बदलने के लिए नहीं था, बस एक सुझाव दिया। वह दिए गए कास्ट विकल्प का उपयोग कर सकता है। –

0

के बाद से आप जानते हैं कि आप इसे नहीं दिया जा सकता है कि आप एक प्रकार है कि Foo फैली कि यह एकFoo है मिल गया है तो क्या होगा?
कुछ इस तरह:

write(List<? extends Foo> items) { 
    //noinspection unchecked 
    process((List<Foo>) items); 
} 

process(List<Foo> items) { 
    // ... 
} 
+0

संभावित अपवाद को पकड़ना सुनिश्चित करें यदि आप 100% निश्चित नहीं हैं कि आइटम 'सूची ' प्रकार हैं। –

+0

यह जावा कंपाइलर त्रुटि फेंकता है। इसलिए प्रश्न – pritam

1

जावा में जेनरिक्स केवल संकलन समय में आपकी सहायता करता है। आप कुछ भी डाल सकते हैं, सुनिश्चित करें कि मूल्य नए प्रकार के लिए जा सकता है।

2
List<? extends Foo> list1 = ... 
List<Foo> list2 = Collections.unmodifiableList(list1); 

कारण क्यों list2 केवल पढ़ने के लिए किया जाना है list1 को देखते अच्छी तरह से Generics : List is same as List?

संबंधित मुद्दे