Type de sécurité: Non coché de l'objet à la liste & lt; MyObject & gt;
J'ai une ListView l'inscription d'un objet personnalisé (disons MyObject
).
Je veux filtrer dynamiquement par le biais d'un EditText
j'ai donc dû mettre en œuvre un getFilter()
avec un publishResults méthode:
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
MyObjectAdapter.this.setItems((List<MyObject>) results.values);
MyObjectAdapter.this.notifyDataSetChanged();
}
À ce point, Eclipse se plaint: Type safety: Unchecked cast from Object to List<MyObject>
Je suis sûr que cette distribution sera toujours vrai, mais Eclipse vous propose d'ajouter @SuppressWarnings("unchecked")
mais je suis totalement contre SuppressWarnings
parce que c'est seulement de cacher le problème, pas une solution...
J'ai essayé d'ajouter:
if(results.values instanceof List<MyObject>)
Mais Eclipse se plaint de 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 correcte, mais qui est la bonne façon de faire le code pour être sûr results.values
est en fait un List<MyObject>
?
Merci d'avance!
source d'informationauteur Eloi Navarro
Vous devez vous connecter pour publier un commentaire.
Si tout ce que vous avez à travailler de est un
Object
alors vous ne pouvez pas vérifier au moment de l'exécution que vous avez réellement unList<MyObject>
parce que le type génériqueMyObject
est utilisé uniquement pour le type de compilation vérification, il est pas disponibles au moment de l'exécution. C'est pourquoi vous obtenez une erreur lorsque vous essayez d'ajouter leinstanceof
vérifier.Si vous êtes sûr que votre
Object
est vraiment toujours unList<MyObject>
alors je dirais que le@SuppressWarnings
est OK, si vous documenter les raisons pour lesquelles vous êtes sûr qu'il n'est pas un problème.Si vous voulez absolument éviter un avertissement si, vous pouvez créer votre propre
List
de mise en œuvre (par exemple,MyObjectList
) qui n'est pas générique, mais met en œuvreList<MyObject>
. Ensuite, vous pouvez faire uninstanceof
de contre-vérifier lesMyObjectList
au moment de l'exécution.Une autre option est de le vérifier et de fonte à
List<?>
comme leinstanceof
erreur suggère. Ensuite, vous pouvez effectuer une itération sur les éléments de la liste et de vérifier si elles sont en fait toutes les instances de MyObject, et les copier sur un nouveauList<MyObject>
.Essayer quelque chose comme cela :
Bien, j'ai enfin réussi à trouver une solution.
Tout comme @Medo42 dit:
Même si je n'ai pas passé par le processus de la création d'un nouvel objet dans le but de faire de ce cas particulier, le travail "d'avertissement" c'était la bonne direction pour aller.
Alors j'ai pris @lokoko l'idée et l'utiliser dans un nouveau
setItems()
méthode, avec unObject
paramètre au lieu d'uneList<MyObject>
afin de s'assurerLe code de résultat est la suivante:
Merci à tous pour votre aide!
Vous pouvez effectuer la vérification avant de passer à
setItems()
.Cependant, vous avez besoin de changer votre
setItems()
méthode en conséquence: