Type de sécurité: Unchecked cast from Object to List <MyObject>

J'ai un ListView énumérant un objet personnalisé (disons MyObject ).

Je souhaite le filtrer dynamiquement via EditText donc j'ai dû implémenter un getFilter() avec une méthode publishResults:

  • Différence entre l'extension LifecycleActivity, Activity, ActionbarActivity & AppCompactActivity?
  • Erreur lors de la gonflement de la classe android.webkit.WebView se produit sporadiquement en production
  • Comment ajouter une marge entre EditText et Soft Keyboard?
  • Comment déterminer si l'application Android s'ouvre à partir du message de notification?
  • Android notification de l'écran hors / sur
  • Appeler une méthode d'activité à partir d'un fragment
  •  @Override protected void publishResults(CharSequence constraint, FilterResults results) { MyObjectAdapter.this.setItems((List<MyObject>) results.values); MyObjectAdapter.this.notifyDataSetChanged(); } 

    À ce stade, Eclipse se plaint: Type safety: Unchecked cast from Object to List<MyObject>

    Je suis sûr que cette distribution sera toujours vraie, mais Eclipse suggère seulement d'ajouter @SuppressWarnings("unchecked") mais je suis totalement contre SuppressWarnings car il ne cache que le problème, pas une solution …

    J'ai essayé d'ajouter:

     if(results.values instanceof List<MyObject>) 

    Mais Eclipse se reproche à nouveau, et cela ne résout rien …

    Cannot perform instanceof check against parameterized type List<MyObject>. Use the form List<?>

    Je sais que le casting sera toujours correct, mais quelle est la bonne façon de faire le code pour être sûr results.values est en fait une List<MyObject> ?

    Merci d'avance!

  • Sqlite insert in table select * from
  • Position personnalisée de l'indice dans la zone de texte d'édition.
  • Comment puis-je lire les messages SMS de l'appareil par programme dans Android?
  • Paire par programme un périphérique Bluetooth sans que l'utilisateur n'ait pénétré
  • Fragments imbriqués et The Back Stack
  • Android: Spécifiez deux images différentes pour la touche toggle à l'aide de XML
  • 4 Solutions collect form web for “Type de sécurité: Unchecked cast from Object to List <MyObject>”

    Si tout ce que vous devez travailler est un Object , alors vous ne pouvez pas vérifier au moment de l'exécution que vous avez une List<MyObject> , car le type générique MyObject n'est utilisé que pour la vérification du type de compilation, il n'est pas disponible au moment de l'exécution . C'est pourquoi vous obtenez une erreur lorsque vous essayez d'ajouter la instanceof vérification.

    Si vous êtes certain que votre Object est toujours une List<MyObject> je dirais que @SuppressWarnings est OK, si vous documentez pourquoi vous êtes sûr que ce n'est pas un problème.

    Si vous voulez absolument éviter un avertissement, vous pouvez créer votre propre implantation de List (par exemple, MyObjectList ) qui n'est pas elle-même générique mais implémente la List<MyObject> . Ensuite, vous pouvez faire une instanceof vérification contre MyObjectList au moment de l'exécution.

    Une autre option est de vérifier et de lancer la List<?> Comme le suggère l' instanceof erreur. Ensuite, vous pouvez itérer sur les éléments de la liste et vérifier s'ils sont en fait toutes les instances de MyObject, et les copier dans une nouvelle List<MyObject> .

    Essayez quelque chose comme ceci:

     List<?> result = (List<?>) results.values; for (Object object : result) { if (object instanceof MyObject) { tempList.add((MyObject) object); // <-- add to temp } } filteredItems = tempList; // <-- set filtered 

    Eh bien, j'ai réussi à trouver une solution.

    Tout comme @ Medo42 a déclaré:

    Une autre option est de vérifier et de lancer dans la liste comme le suggère l'instance d'erreur. Ensuite, vous pouvez itérer sur les éléments de la liste et vérifier s'ils sont réellement toutes les instances de MyObject, et les copier dans une nouvelle liste.

    Même si je n'ai pas examiné le processus de création d'un tout nouvel objet afin de faire en sorte que ce cas particulier fonctionne «sans avertissement», c'était la bonne direction à suivre.

    J'ai donc pris l'idée de @lokoko et l'utiliser dans une nouvelle méthode setItems() , avec un paramètre Object au lieu d'une List<MyObject> afin de s'assurer

    Le code de résultat est le suivant:

     public void setItems(List<MyObject> var){ this.list = var; } public void setItems(Object var){ List<MyObject> result = new ArrayList<MyObject>(); if (var instanceof List){ for(int i = 0; i < ((List<?>)var).size(); i++){ Object item = ((List<?>) var).get(i); if(item instanceof MyObject){ result.add((MyObject) item); } } } setItems(result); } 

    Merci à tous pour votre aide!

    Vous pouvez effectuer la vérification avant de passer à setItems() .

     final Object myListObj = reuslts.values; if(myListObj instanceof List<?>) { if(((List<?>)myListObj).get(0) instanceof MyObject) // You can safely suppress the warning here because you made sure it is a List containing MyObject MyObjectAdapter.this.setItems((List<? extends MyObject>) myListObj); } 

    Toutefois, vous devez modifier votre méthode setItems() conséquence:

     public void setItems(List<? extends MyObject> list) { // Your code here } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.