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:

  • Comment puis-je obtenir le nom enregistré de SMS Sender Contact (Personne) en utilisant "content: // sms / inbox"
  • Le clavier Webview Android n'apparaît pas longtemps pour entrer des valeurs
  • Tourner le marqueur en fonction de la direction de conduite
  • Fonctionnement d'OpenUDID
  • Changer le numéro de version de la base de données SQLite
  • Dans Android, chaque écran devrait-il être sa propre activité ou sa mise en page?
  •  @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!

  • Comment créer des fichiers .docx et des fichiers .xlsx sur Android
  • Android - Google Spreadsheet Api
  • Mise à jour de Studio Android: certains conflits trouvés dans la zone d'installation
  • Android Studio 0.4: Impossible de trouver la méthode jniDir ()
  • Créez des erreurs après avoir ajouté une activité en plein écran dans Android Studio
  • ViewGroup {TextView, ...} .getMeasuredHeight donne une mauvaise valeur est plus petite que la hauteur réelle
  • 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.