2013-05-15 9 views
5

पर कॉल करने योग्य के सबिनटरफ़ेस को लागू करता है Callable<T> के ExecutorService पर उपनिर्देशन लागू करने वाला कार्य कैसे सबमिट करें? कार्य सबमिट करें जो एक निष्पादक सेवा

public interface CtiGwTask<T> 
    extends Callable { 

    ... 
} 

यह सिर्फ कुछ स्थिर स्थिरांक को परिभाषित करता है, लेकिन कोई तरीकों को जोड़ता है:

मैं Callable<T> के subinterface के रूप में परिभाषित किया है।

तब मेरे पास निम्न विधि है जहां execServiceFixedThreadPool उदाहरण है।

@Override 
public CtiGwTaskResult<Integer> postCtiTask(CtiGwTask<CtiGwTaskResult<Integer>> task) { 

    Future<CtiGwTaskResult<Integer>> result = 
      execService.submit(task); 

    try { 
     return result.get(); 

    } catch (InterruptedException | ExecutionException ex) { 
     LOGGER.log(Level.FINEST, 
       "Could not complete CTIGwTask", ex); 
     return new CtiGwTaskResult<>(
       CtiGwResultConstants.CTIGW_SERVER_SHUTTINGDOWN_ERROR, 
       Boolean.FALSE, 
       "Cannot complete task: CTIGateway server is shutting down.", 
       ex); 
    } 
} 

दुर्भाग्यवश यह 2 अनचेक रूपांतरण और 1 अनचेक विधि आमंत्रण चेतावनियां दे रहा है।

...\CtiGwWorkerImpl.java:151: warning: [unchecked] unchecked conversion 
      execService.submit(task); 
required: Callable<T> 
found: CtiGwTask<CtiGwTaskResult<Integer>> 
where T is a type-variable: 
    T extends Object declared in method <T>submit(Callable<T>) 

...\CtiGwWorkerImpl.java:151: warning: [unchecked] unchecked method invocation: method submit in interface ExecutorService is applied to given types 
      execService.submit(task); 
required: Callable<T> 
found: CtiGwTask<CtiGwTaskResult<Integer>> 
where T is a type-variable: 
    T extends Object declared in method <T>submit(Callable<T>) 

...\CtiGwWorkerImpl.java:151: warning: [unchecked] unchecked conversion 
      execService.submit(task); 
required: Future<CtiGwTaskResult<Integer>> 
found: Future 

मैं

Future<CtiGwTaskResult<Integer>> result = 
    execService.submit((Callable<CtiGwTaskResult<Integer>>) task); 

को submit कॉल को बदलते हैं तो सब कुछ काम करने के लिए लगता है, लेकिन अब मैं एक अनियंत्रित डाली चेतावनी मिलती है।

...\src\com\dafquest\ctigw\cucm\CtiGwWorkerImpl.java:151: warning: [unchecked] unchecked cast 
      execService.submit((Callable<CtiGwTaskResult<Integer>>) task); 
required: Callable<CtiGwTaskResult<Integer>> 
found: CtiGwTask<CtiGwTaskResult<Integer>> 

तो मुझे क्या याद आ रही है? submit() कॉल करने योग्य के उप-वर्ग के उदाहरण पर लागू नहीं होना चाहिए?

+0

यदि यह 'भविष्य > परिणाम = execService.submit ((प्रतिदेय >) कार्य);' आप देता है एक 'cast' चेतावनी, क्यों' भविष्य > परिणाम = (भविष्य >) execService.submit ((प्रतिदेय >) कार्य) की कोशिश नहीं करते हैं, '? यदि आप इस तरह कुछ करने की कोशिश करते हैं तो आप पोस्ट भी कर सकते हैं। – DaGLiMiOuX

+0

इतनी सारी चीज़ें आज़माएं जिन्हें मैं वास्तव में याद नहीं कर सकता लेकिन मैंने अभी परीक्षण किया और जैसा कि मुझे संदेह है कि कुछ भी नहीं बदला है। चेतावनी '(कॉल करने योग्य >) कार्य' कास्ट को संदर्भित करती है लेकिन एक बार लागू प्रकार और मेथोस आमंत्रण लागू नहीं होता है "अनचेक"। – AndRAM

उत्तर

8

आप कच्चेCallable प्रकार का उपयोग कर रहे हैं।

बदलें:

public interface CtiGwTask<T> extends Callable 
इस के लिए

:

public interface CtiGwTask<T> extends Callable<T> 
+0

वह था, बहुत धन्यवाद! – AndRAM

+0

गैर समस्या :) कच्चे प्रकार बुरा हैं और हर कीमत से बचा जाना चाहिए। – Bohemian

+0

पूरी तरह से सहमत हैं लेकिन मुझे कहना होगा कि मैं वास्तव में जावा के जेनेरिक वाक्यविन्यास के साथ संघर्ष कर रहा हूं :-) – AndRAM

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