477 votes

Qu'est-ce que SuppressWarnings ("non vérifié") en Java ?

Parfois, en examinant le code, je vois que de nombreuses méthodes spécifient une annotation :

@SuppressWarnings("unchecked")

Qu'est-ce que cela signifie ?

446voto

Jon Skeet Points 692016

Parfois, les génériques Java ne vous permettent tout simplement pas de faire ce que vous voulez, et vous devez effectivement dire au compilateur que ce que vous faites est vraiment se être légal au moment de l'exécution.

Je trouve généralement cela pénible lorsque je simule une interface générique, mais il existe d'autres exemples. Il vaut généralement la peine d'essayer de trouver un moyen d'éviter l'avertissement plutôt que de le supprimer (la fonction FAQ sur les génériques Java aide ici) mais parfois, même s'il est possible, cela déforme tellement le code que la suppression de l'avertissement est plus propre. Dans ce cas, ajoutez toujours un commentaire explicatif !

La même FAQ sur les génériques comporte plusieurs sections sur ce sujet, à commencer par les suivantes "Qu'est-ce qu'un avertissement "non vérifié" ?" - cela vaut la peine d'être lu.

13 votes

Dans certains cas, vous pouvez l'éviter en utilisant YourClazz.class.cast(). Fonctionne pour les conteneurs à élément générique unique, mais pas pour les collections.

0 votes

Ou, de préférence, utiliser des génériques joker (YourClazz<?>) - Java n'émet jamais d'avertissement sur ces casts, car ils sont sûrs. Cependant, cela ne fonctionne pas toujours (voir la FAQ sur les génériques pour plus de détails).

50voto

Ben Lakey Points 5454

Il s'agit d'une annotation permettant de supprimer les avertissements de compilation concernant les opérations génériques non vérifiées (pas les exceptions), telles que les castings. Elle implique essentiellement que le programmeur ne souhaite pas être averti de ces opérations dont il est déjà conscient lors de la compilation d'un bout de code particulier.

Vous pouvez en savoir plus sur cette annotation spécifique ici :

SuppressWarnings

En outre, Oracle fournit une documentation didactique sur l'utilisation des annotations ici :

Annotations

Comme ils l'ont dit,

"L'avertissement 'non vérifié' peut se produire lors de l'interfaçage avec du code hérité écrit avant l'avènement des génériques (abordé dans la leçon intitulée Génériques)."

22voto

kd304 Points 8369

Cela pourrait également signifier que la version actuelle du système de type Java n'est pas assez bonne pour votre cas. Il y a eu plusieurs Propositions de JSR / hacks pour résoudre ce problème : Tapez les jetons, Jetons Super Type , Class.cast().

Si vous avez vraiment besoin de cette suppression, réduisez-la autant que possible (par exemple, ne la mettez pas sur la classe elle-même ou sur une longue méthode). Un exemple :

public List<String> getALegacyListReversed() {
   @SuppressWarnings("unchecked") List<String> list =
       (List<String>)legacyLibrary.getStringList();

   Collections.reverse(list);
   return list;
}

11voto

Brandon E Taylor Points 10927

El SuppressWarning est utilisée pour supprimer les avertissements du compilateur pour l'élément annoté. Plus précisément, l'élément unchecked permet de supprimer les avertissements du compilateur générés à la suite de castings de types non vérifiés.

0 votes

Votre lien SupressWarning est mort ; voici une alternative : docs.oracle.com/javase/specs/jls/se6/html/

6voto

s.k.sumaprakash Points 21

Vous pouvez supprimer les avertissements du compilateur et dire aux génériques que le code que vous avez écrit est légal selon eux.

Exemple :

@SuppressWarnings("unchecked")
public List<ReservationMealPlan> retreiveMealPlan() {
     List<ReservationMealPlan> list=new ArrayList<ReservationMealPlan>();
    TestMenuService testMenuService=new TestMenuService(em, this.selectedInstance);
    list = testMenuService.getMeal(reservationMealPlan);
    return list;
 }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X