Java 6: avertissement non pris en charge @SuppressWarnings ( « rawtypes »)
-
01-10-2019 - |
Question
je me suis déplacé vers une nouvelle machine qui a le dernier compilateur Java de Sun et a remarqué quelques avertissements dans le code existant Java 6. L'Eclipse IDE, a suggéré que j'annote la mission avec:
@SuppressWarnings("rawtypes")
Par exemple:
class Foo<T> {
...
}
...
@SuppressWarnings("rawtypes")
Foo foo = new Foo();
Quand je suis revenu à la machine avec le compilateur ancien (JDK 1.6.0_20), je l'ai remarqué que ce compilateur avertit maintenant plus au sujet de la suppression des avertissements « de rawtypes », affirmant que cette suppression est non pris en charge et propose de le remplacer avec @SuppressWarnings ( "sans contrôle"). De plus, il y avait des endroits où le nouveau compilateur par défaut, m'a fait de mettre les deux « non vérifiées » et « rawtypes » - la compilation de ce code avec le compilateur ancien reproduit le même avertissement
.Comment puis-je appliquer la compatibilité arrière / avant entre les deux, de sorte que ni le compilateur produit des avertissements?
La solution
Vous pouvez utiliser la @SuppressWarnings("unchecked")
qui est pris en charge à la fois par le compilateur Eclipse et javac.
Mais rappelez-vous l'annotation @SuppressWarnings
est utilisé par votre compilateur qui peut avoir ses propres valeurs. Les seules forces JLS le compilateur de comprendre les valeurs « sans contrôle » et « désapprouvée » (pour l'instant).
vendeurs du compilateur doivent documenter les noms d'avertissement qu'ils prennent en charge conjointement avec ce type d'annotation. Ils sont encouragés à coopérer pour faire en sorte que les mêmes noms travaillent sur plusieurs compilateurs .
Si vous utilisez Helios, vous devez définir une option spécifique pour permettre @SuppressWarnings("unchecked")
au lieu de @SuppressWarnings("rawtypes")
,
Dans le cas où il est impossible de mettre à jour le code avec le nouveau jeton, la propriété système
suppressRawWhenUnchecked=true
peut être réglé lors du démarrage Eclipse.
Ressources:
- JLS - @SuppressWarnings ()
- Eclipse JDT ( compilateur Java , Nouveau "rawtypes" jeton pour @SuppressWarnings annotation )
EDIT: Voici l'article de Knol maintenant disponible 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é comme une annotation standard dans Java SE 5.
Définition
@ SuppressWarnings annotation est définie dans la spécification du langage Java section 9.6.1.5 . Cet article stipule:
Le contrôle du type d'annotation supports de
SuppressWarnings
programmeur sur les avertissements autrement émis par le compilateur Java. Il contient un seul élément qui est un tableau deString
. Si une déclaration de programme est annoté avec le@SuppressWarnings(value = {S1, ... , Sk})
d'annotation, puis un compilateur Java ne doit pas signaler tout 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 l'une de ses parties .avertissements non contrôlés sont identifiés par la chaîne "
unchecked
".Types d'avertissement valides
Les deux chaînes d'avertissement qui sont mentionnées dans la spécification elle-même sont « sans contrôle » et « dévalorisation ». Cependant, le Sun JDK utilise un ensemble plus large 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 montre:
- tous - Supprimer tous les avertissements de ce code
- deprecation - avertissements en utilisant le code de Suppress dépréciée
- sans contrôle - les avertissements d'un appel Suppress sans contrôle ou une distribution non contrôlée
- fallthrough - avertissements si un interrupteur Suppress tombe à travers sans trouver un cas valide (et non par défaut)
- chemin -
- série - avertissements Supprimer si une classe Serializable ne définit pas serialVersionUID
- enfin - les avertissements de retour dans Suppress finally (qui Ignore retour à l'essai)
Et Sun JDK 1.6 ajoute:
- Casting
- divzero - supprimer les avertissements si division entière par zéro est détecté
- vide
- overrides
- aucun
et IDEs 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 de statique spécifique effectuée par l'EDI.
Eclipse
Les valeurs d'alerte pour Eclipse Eclipse 3.3 sont documentée dans les docs JDT .
- tous - Supprimer tous les avertissements
- boxe - avertissements Suppress par rapport aux opérations de boxe / unboxing
- cast - avertissements relatifs à Suppress opérations de la distribution
- dep-ann - supprimer les avertissements par rapport à l'annotation Obsolète
- deprecation - supprimer les avertissements par rapport à deprecation
- fallthrough - avertissements relatifs à Suppress manquantes des ruptures dans les états de commutation
- enfin - les avertissements Suppress par rapport à bloquer enfin qui ne renvoient pas
- cacher - supprimer les avertissements relatifs à la population locale que variable cacher
- incomplète commutateur - Supprimer les avertissements relatifs aux entrées manquantes dans une instruction switch (ENUM cas)
- nls - supprimer les avertissements par rapport à littéraux de chaîne non-nls
- null - supprimer les avertissements par rapport à l'analyse de null
- restriction - les avertissements relatifs à l'utilisation Suppress des références ou interdites découragez
- série - supprimer les avertissements par rapport à manquante dans le champ serialVersionUID pour une classe sérialisable
- -accès statique - supprimer les avertissements par rapport à l'accès statique incorrect
- accès synthétique - supprimer les avertissements par rapport à l'accès non optimisée de classes internes
- sans contrôle - supprimer les avertissements par rapport aux opérations non vérifiées
- champ d'accès sans réserve - supprimer les avertissements par rapport à l'accès sur le terrain non qualifié
- utilisé - supprimer les avertissements par rapport 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(); }
Autres conseils
Notez que doesnt Eclipse 3.5 comprendre rawtypes et drapeaux d'avertissement à passer à décochée. Il est frustrant que Eclipse est venu avec annotation rawtypes qui provoque plus de problèmes que la résolution. Ils auraient dû juste coincé avec le standard.