Java如何处理来自Object </myitem>的Array <myitem>的“Unchecked cast”

时间:2013-06-24 11:31:44

标签: java android casting arraylist warnings

在我的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>声明,则会抛出“未选中的作业”

3 个答案:

答案 0 :(得分: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());

答案 1 :(得分: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,然后在删除它时转换每个元素。

答案 2 :(得分:0)

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