4

在我的 Android 项目中,我创建了一个抽象的 AsyncTask 类,我在其中输入 URL 以及如果需要分页信息,因此我不需要继续编写 HTTP 内容等。

我制作了一个抽象方法 onAsyncTaskResult(Object o) 必须在使用时实现。但是,当将其转换为适当的对象(可以是不同类型)时,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>声明,它会引发“未经检查的分配”

4

3 回答 3

5

你不能在没有警告的情况下这样做。您正在将 an 强制转换Object为其他类,即使Object是您的实例,ArrayList您也不知道它是泛型类型。

更新:

如果您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());
于 2013-06-24T11:34:22.567 回答
3

您无法避免警告,但可以使用@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,然后在删除每个元素时转换它。

于 2013-06-24T11:45:02.750 回答
0

您可以将对象转换为 ArrayList。你不能把它转换成你的类型

于 2013-06-24T11:38:31.003 回答