2013-06-24 1 views
3

В моем проекте Android я создал абстрактный класс AsyncTask, в который я ввожу URL-адрес и, при необходимости, информацию подкачки, поэтому мне не нужно писать материал HTTP и т. д.Java как обрабатывать «Unchecked cast» для Array <MyItem> от Object

Я сделал абстрактный метод, onAsyncTaskResult (Object o), который должен быть реализован при использовании. Однако при заливке его к соответствующему объекту (может быть разных типов) интегрированная среда дает мне предупреждение

"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> декларации он бросает «Unchecked задание»

+1

Вы можете использовать только 'ArrayList', но не' ArrayList '. Это связано с тем, что к моменту компиляции кода каждая ссылка на' MyItem' теряется и заменяется ссылкой на 'Object'. –

+0

Спасибо Мика, отличное объяснение! – Rae

ответ

5

Вы не можете сделать это без предупреждения. Вы отправляете Object в какой-либо другой класс, и даже если Object является экземпляром ArrayList, вы не знаете его общий тип.

Update:

если вы написали 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, а затем отливали каждый элемент, как вы удалите его.