2013-07-26 240 views
3

MyClass.java爲什麼我的返回值沒有正確識別?

protected LinkedBlockingDeque<JobSet> currentWork = new LinkedBlockingDeque<JobSet>(); 

public LinkedBlockingDeque<JobSet> getCurrentWork() { 
    return currentWork; 
} 

使用

public boolean completeAllWork(CompleteWorkRequest request) { 
    for (JobSet jobSet : getCurrentWork()) { 
     //if it's approved, find the workflow process it needs to go to next and put it there 
     if (request.getApprovedJobSets().contains(jobSet.getUuid().toString())) { 
      sendToNextWorkflowProcess(jobSet); 
     } else { 
      getCurrentWork().remove(jobSet); 
      logger.info("Rejected JobSet: " + jobSet.getUuid()); 
     } 
    } 

    getWorkFromQueue(); 

    return true; 
} 

該公司預計一JobSet,但得到的Object。我很清楚它正在返回適當的對象,所以我錯過了什麼?

Error: java: incompatible types 
    required: com.production.model.JobSet 
    found: java.lang.Object 
+2

你可以分享一些for循環的主體嗎? –

+1

JobSet是一個對象。 – Makky

+0

錯誤是什麼?你可以發佈堆棧跟蹤嗎? – Alex

回答

2

每註釋:使用Iterator應解決問題。我的猜測是迭代列表並同時刪除一個項目時會產生干擾,導致循環讀取已刪除的值。

+0

不使用迭代器最多會導致運行時錯誤。原始的編譯時錯誤一定是由其他原因造成的。 – Joni

+0

爲什麼這個答案被接受? –

+0

我被告知把它作爲一個答案,因爲它明顯地解決了這個問題。不過@Joni指出:這不可能是原因。很高興看到當前的代碼,所以我們可以確定實際造成的結果。 –

0

這可能是你的方法之一被聲明爲返回一個LinkedBlockingDeque而不是LinkedBlockingDeque<JobSet>

  • 檢查申報的退貨類型getApprovedJobSets()
  • 看看方法getWorkFromQueue()中的代碼,也許錯誤就是在那裏引發的。

此外,編譯器是否提供任何「未檢查類型」或「原始類型」警告?

0

其實,如果我理解正確,你的錯誤不是來自return語句,而是來自else語句中的兩行。 我想你應該看看這個方法返回的是什麼,並試圖修改它們

0

你不能說你從迄今發佈的代碼提的錯誤。此編譯沒有錯誤:

import java.util.concurrent.LinkedBlockingDeque; 
import java.util.Collection; 

class dummy { 
    static class JobSet {public Object getUuid() {return null;}} 
    static class CompleteWorkRequest {public Collection getApprovedJobSets() {return null;}}; 
    void getWorkFromQueue() {} 
    void sendToNextWorkflowProcess(JobSet js) {} 


    protected LinkedBlockingDeque<JobSet> currentWork = new LinkedBlockingDeque<JobSet>(); 

    public LinkedBlockingDeque<JobSet> getCurrentWork() { 
     return currentWork; 
    } 

    public boolean completeAllWork(CompleteWorkRequest request) { 
     for (JobSet jobSet : getCurrentWork()) { 
      //if it's approved, find the workflow process it needs to go to next and put it there 
      if (request.getApprovedJobSets().contains(jobSet.getUuid().toString())) { 
       sendToNextWorkflowProcess(jobSet); 
      } else { 
       getCurrentWork().remove(jobSet); 
       //logger.info("Rejected JobSet: " + jobSet.getUuid()); 
      } 
     } 

     getWorkFromQueue(); 

     return true; 
    } 
} 
相關問題