2013-06-24 92 views
3

在我的Android項目中,我製作了一個抽象的AsyncTask類,其中輸入了URL,如果需要的話可以使用分頁信息,所以我不需要繼續寫HTTP的東西等Java如何處理「Unchecked cast」Array <MyItem> from Object

我做了一個抽象的方法,onAsyncTaskResult(對象o)必須實施使用。是說,我的FPGA實現的代碼片段 然而,鑄造到合適的對象時(可以是不同類型的)的IDE給我一個警告

"Unchecked cast for java.lang.Object to java.util.ArrayList<com.company.package.subpackage.MyItem>"

以下功能

new SuperCoolAsyncTask() { 
     @Override 
     protected void onAsyncTaskResult(Object o) { 
      if(o instanceof ArrayList) { 
      //generates warning in the following line 
      AppConstants.scoreStatistics = (ArrayList<MyItem>)o; 
     } 
    } 
}.execute(get_url_score_statistics()); 

如何我應該把這個投到ArrayList<MyItem>而不會產生警告?

沒有<MyItem>聲明它拋出一個「未分配」

+1

您只能強制轉換爲'ArrayList',而不能轉換爲'ArrayList ',這是因爲在編譯代碼時,每次引用MyItem都會丟失並替換爲Object的引用 –

+0

米莎,很好的解釋! – Rae

回答

5

你不能做沒有警告。您正在將Object轉換爲其他類,即使ObjectArrayList的實例,您也不知道它是通用類型。

更新:

如果你自己寫SuperCoolAsyncTask,你可以參數化泛型類:

public abstract class SuperCoolAsyncTask<ResultType> { 

    protected abstract void onAsyncTaskResult(ResultType o); 

} 

然後,當你調用代碼:

new SuperCoolAsyncTask<ArrayList<MyItem>>() { 
    @Override 
    protected void onAsyncTaskResult(ArrayList<MyItem> o) { 
      AppConstants.scoreStatistics = o; 
    } 
}.execute(get_url_score_statistics()); 
0

可以投你的對象ArrayList。您無法將其轉換爲您的類型

2

您無法避免該警告,但可以用@SuppressWarnings註釋將其隱藏。試試這個:

new SuperCoolAsyncTask() { 
     @Override 
     @SuppressWarnings("unchecked") 
     protected void onAsyncTaskResult(Object o) { 
      if(o instanceof ArrayList) { 
      //generates warning in the following line 
      AppConstants.scoreStatistics = (ArrayList<MyItem>)o; 
     } 
    } 
}.execute(get_url_score_statistics()); 

另一種選擇,如果你真的擔心類型安全,是離開通用未指定(即只轉換爲ArrayList中,ArrayList不是,然後抹上每個元素,你刪除它。