web-dev-qa-db-fra.com

Java 6: avertissement @SuppressWarnings ("rawtypes") non pris en charge)

Je suis passé à une nouvelle machine qui a le dernier compilateur Java de Sun) et j'ai remarqué quelques avertissements dans le code Java 6) existant. L'IDE Eclipse, m'a suggéré d'annoter la mission avec:

@SuppressWarnings("rawtypes")

Par exemple:

class Foo<T> {
...
}
...
@SuppressWarnings("rawtypes")
Foo foo = new Foo();

Lorsque je suis revenu sur la machine avec l'ancien compilateur (JDK 1.6.0_20), j'ai remarqué que cet ancien compilateur avertit maintenant de la suppression des avertissements "rawtypes", affirmant que cette suppression n'est pas prise en charge et proposant de la remplacer par @SuppressWarnings ("décoché"). En outre, il y avait des endroits où le plus récent compilateur, par défaut, m'a obligé à mettre à la fois "non vérifié" et "rawtypes" - la compilation de ce code avec l'ancien compilateur reproduit le même avertissement.

Comment puis-je appliquer la compatibilité ascendante/descendante entre les deux, afin qu'aucun compilateur ne produise d'avertissements?

41
eold

Vous pouvez utiliser la @SuppressWarnings("unchecked") qui est prise en charge par le compilateur Eclipse et javac.

Mais rappelez-vous que l'annotation @SuppressWarnings Est utilisée par votre compilateur qui peut avoir ses propres valeurs. Le JLS force uniquement le compilateur à comprendre les valeurs "non vérifiées" et "obsolètes" (pour l'instant).

Les fournisseurs de compilateurs doivent documenter les noms d'avertissement qu'ils prennent en charge conjointement avec ce type d'annotation. Ils sont encouragés à coopérer pour s'assurer que les mêmes noms fonctionnent sur plusieurs compilateurs.

Si vous utilisez Helios, vous devrez définir une option spécifique pour autoriser @SuppressWarnings("unchecked") au lieu de @SuppressWarnings("rawtypes"),

Dans le cas où il n'est pas possible de mettre à jour le code avec le nouveau jeton, la propriété système suppressRawWhenUnchecked=true Peut être définie lors du démarrage d'Eclipse.


Ressources:


EDIT: Voici l'article knol maintenant indisponible qui a été utilisé comme référence, écrit à l'origine par Alex Miller .

@SuppressWarnings Annotation en Java

Annotation standard pour supprimer divers avertissements

L'annotation SuppressWarnings a été ajoutée en tant qu'annotation standard dans Java SE 5.

Définition

L'annotation @ SuppressWarnings est définie dans la spécification de langage Java section 9.6.1.5 . Cette section indique:

Le type d'annotation SuppressWarnings prend en charge le contrôle du programmeur sur les avertissements autrement émis par le compilateur Java. Il contient un seul élément qui est un tableau de String. Si un programme est annotée avec l'annotation @SuppressWarnings(value = {S1, ... , Sk}), puis un compilateur Java ne doit pas signaler d'avertissement identifié par l'un des S1, ..., Sk si cet avertissement aurait été généré à la suite de la déclaration annotée ou de l'une de ses parties.

Les avertissements non vérifiés sont identifiés par la chaîne "unchecked".

La suite section sur @Deprecation Mentionne également que ces avertissements peuvent être supprimés avec @SuppressWarnings("deprecation").

Types d'avertissement valides

Les deux seules chaînes d'avertissement qui sont mentionnées dans la spécification elle-même sont "non vérifiées" et "obsolètes". Cependant, le Sun JDK utilise un plus grand ensemble de chaînes dans le compilateur. Vous pouvez déterminer l'ensemble actuel en exécutant:

javac -X

qui vous montrera (entre autres) les paramètres valides pour -Xlint.

Par exemple, Sun JDK 1.5 affiche:

  • all - supprime tous les avertissements de ce code
  • obsolète - supprimer les avertissements de l'utilisation de code obsolète
  • unchecked - supprime les avertissements d'un appel non contrôlé ou d'un cast non contrôlé
  • fallthrough - supprime les avertissements si un commutateur tombe à travers sans trouver un cas valide (et pas de défaut)
  • chemin -
  • serial - supprime les avertissements si une classe Serializable ne définit pas un serialVersionUID
  • enfin - supprime les avertissements de retour dans un finalement (qui ignorera le retour avec l'essai)

Et Sun JDK 1.6 ajoute:

  • jeter
  • divzero - supprime les avertissements si une division entière par zéro est détectée
  • vide
  • remplace
  • none

Les IDE et les outils d'analyse statique prennent généralement en charge un grand nombre d'autres valeurs possibles pour @SuppressWarnings. Ces valeurs correspondent à des contrôles d'analyse statique spécifiques effectués par l'EDI.

Éclipse

Les valeurs d'avertissement Eclipse pour Eclipse 3.3 sont documentées dans les documents JDT .

  • tous - supprimer tous les avertissements
  • boxe - supprime les avertissements relatifs aux opérations de boxe/déballage
  • cast - supprime les avertissements relatifs aux opérations de cast
  • dep-ann - supprime les avertissements relatifs aux annotations obsolètes
  • dépréciation - supprimer les avertissements relatifs à la dépréciation
  • fallthrough - supprime les avertissements relatifs aux ruptures manquantes dans les instructions switch
  • enfin - supprime les avertissements relatifs au bloc finalement qui ne revient pas
  • masquage - supprime les avertissements relatifs aux sections locales qui masquent la variable
  • commutateur-incomplet - supprime les avertissements relatifs aux entrées manquantes dans une instruction switch (cas enum)
  • nls - supprime les avertissements relatifs aux littéraux de chaîne non nls
  • null - supprime les avertissements relatifs à l'analyse nulle
  • restriction - supprimer les avertissements relatifs à l'utilisation de références découragées ou interdites
  • serial - supprime les avertissements relatifs au champ serialVersionUID manquant pour une classe sérialisable
  • static-access - supprime les avertissements relatifs à un accès statique incorrect
  • accès synthétique - supprime les avertissements relatifs à l'accès non optimisé des classes internes
  • unchecked - supprime les avertissements relatifs aux opérations non contrôlées
  • unqualified-field-access - supprime les avertissements relatifs à l'accès au champ non qualifié
  • inutilisé - supprime les avertissements relatifs au code inutilisé

IntelliJ

NetBeans

Exemples

Un exemple de spécification d'un seul avertissement:

@SuppressWarnings("unchecked")
public void methodWithScaryWarnings() {
    List rawList = new ArrayList();
    List<String> stringList = (List<String>)rawList;
}

Un exemple d'utilisation de deux avertissements:

@SuppressWarnings({"unchecked","deprecation"})
public void methodWithScaryWarnings() {
    callDeprecatedMethod();
}
43
Colin Hebert

Notez qu'Eclipse 3.5 ne comprend pas les types bruts et signale un avertissement pour passer à non coché. Il est frustrant qu'Eclipse ait proposé une annotation de types bruts qui pose plus de problèmes que de résolution. Ils auraient dû juste s'en tenir à celui standard.

4
inder