2008-12-16 17 views
8

मुझे समझ में क्यों असफल इस कोड संकलन नहीं होगाinvokeAll() <Callable<T>>

ExecutorService executor = new ScheduledThreadPoolExecutor(threads); 

class DocFeeder implements Callable<Boolean> {....} 
... 
List<DocFeeder> list = new LinkedList<DocFeeder>(); 
list.add(new DocFeeder(1)); 
... 
executor.invokeAll(list); 

त्रुटि संदेश है एक संग्रह स्वीकार करने को तैयार नहीं है DocFeeder, जो Callable<Boolean> लागू करता है - क्या चल रहा है ?!

उत्तर

18

बस सौआ के उत्तर पर विस्तार करने के लिए थोड़ा ...

invokeAll(Collection<Callable<T>> tasks) 

जावा 6 में, विधि के रूप में घोषित किया जाता है:जावा 5 में, विधि के रूप में घोषित किया गया था

invokeAll(Collection<? extends Callable<T>> tasks) 

wildcarding अंतर बहुत महत्वपूर्ण है - क्योंकि List<DocFeeder>है एक Collection<? extends Callable<T>> लेकिन यह Collection<Callable<T>> है। विचार करें कि इस विधि के साथ क्या होगा:

public void addSomething(Collection<Callable<Boolean>> collection) 
{ 
    collection.add(new SomeCallable<Boolean>()); 
} 

कि कानूनी है - लेकिन यह स्पष्ट रूप से बुरा है अगर आप एक List<DocFeeder> साथ addSomething कॉल कर सकते हैं के रूप में यह सूची में एक गैर DocFeeder जोड़ने की कोशिश करेंगे।

तो, यदि आप जावा 5 के साथ फंस गए हैं, तो आपको List<DocFeeder> से List<Callable<Boolean>> बनाना होगा।

7

कोड जावा 6 के साथ बिल्कुल ठीक संकलित, लेकिन

Foo.java:9: cannot find symbol 
symbol : method invokeAll(java.util.List) 
location: interface java.util.concurrent.ExecutorService 
executor.invokeAll(list); 
     ^
1 error

हालांकि list इस तरह बदलते देने जावा 5 के साथ संकलित करने के लिए विफल रहता है कि:

Collection<Callable<Boolean>> list = new LinkedList<Callable<Boolean>>(); 

यह दोनों जावा 5 और पर काम करता है जावा 6.

0

विस्तृत उत्तर के लिए धन्यवाद, लेकिन यह अभी भी मुझे खराब करता है - कॉल करने योग्य एक इंटरफ़ेस है, इसलिए वास्तव में, जॉन के उत्तर में "addSomething" फ़ंक्शन ठीक होना चाहिए (न केवल कानूनी, लेकिन उचित) - क्योंकि, ठीक है, यह है इंटरफेस का पूरा बिंदु - जब तक आप कुछ शुरुआती समझौते का पालन करते हैं, मुझे कोई परवाह नहीं है कि आप किस ऑब्जेक्ट को सूची में जोड़ देंगे। आईएमओ, आपके द्वारा प्रस्तुत की गई समस्या को एक अलग दायरे पर संबोधित किया जाना चाहिए।

कि इसके अलावा, इस तथ्य है कि कोड को संकलित नहीं किया है - और यह होना चाहिए ...

+0

नहीं, यह * नहीं * (जावा 5 के खिलाफ) तैयार की है चाहिए - उसकी वजह से बहुत भिन्न समस्या है। जेनेरिक में मूल रूप से भिन्नता उस तरीके से काम नहीं करती है जिसकी आप अपेक्षा करते हैं, और नहीं - यह खतरनाक होगा। –

+0

(बेशक, उन्हें Java 6 में जिस तरीके से जावा 6 में किया गया था, उसे विधि घोषित करनी चाहिए थी - लागू फिक्स पूरी तरह उपयुक्त है।) –

+1

फिक्स अनुचित है क्योंकि इसका मतलब है कि आप दोनों 1.5 के लिए एक एक्जिक्यूटर्स सेवा को साफ़ रूप से नहीं लिख सकते और 1.6। (jsr166_ ने दोनों कॉकअप के लिए माफी मांगी है।) –

0
Collection<Callable<Boolean>> list = new LinkedList<Callable<Boolean>>(); 
संबंधित मुद्दे