web-dev-qa-db-fra.com

Comment éviter les avertissements de conversion non vérifiés en Java, si vous utilisez des bibliothèques héritées?

J'aime la fonctionnalité générique en Java et l'utilise souvent. Mais j'ai un problème si j'utilise des bibliothèques qui ne sont pas encore au courant des génériques. Un exemple sont les servlets. Si vous utilisez ServletRequest.getParameterMap(), le résultat sera une carte brute, mais elle ne comprend que String en tant que clés et String[] en tant que valeurs. Donc, je veux l'assigner à un Map<String, String[]>. Mais pour cette mission, je reçois un avertissement. Comment puis-je éviter cet avertissement avec la langue, non pas simplement en supprimant l'avertissement avec l'annotation @SuppressWarnings.

26
Mnementh

Comme d'autres l'ont dit, les avertissements ne peuvent être évités qu'en les supprimant. Le problème, à mon humble avis, est que vous devez soit ajouter des annotations à votre code, soit les ignorer globalement, soit les ignorer globalement et risquer des erreurs.

IIRC propose de générer des avertissements lorsque les types bruts sont renvoyés au lieu de l'appel. 

En attendant, je pense que la meilleure approche consiste à utiliser une méthode d'encapsulation afin que les avertissements soient limités à un seul endroit, où il est prudent de les ignorer:

class NoWarn {
  public static Map<String, String[]> getParameterMap(ServletRequest r) 
  {
    @SuppressWarnings("unchecked")
    Map<String, String[]> result = r.getParameterMap();
    return result;
  }
}

Remarque Cette réponse a été modifiée avec un commentaire indiquant que les annotations ne peuvent pas figurer dans le corps de la méthode. C'est incorrect, ce qui précède est syntaxiquement correct. J'ai annulé le changement. 

40
Miserable Variable

La meilleure chose à faire est d'encapsuler la conversion du code hérité en code générique et de supprimer l'avertissement uniquement à cet endroit.

Par exemple. vous pouvez placer une façade générique sur votre ancienne bibliothèque, bien que cela ne soit pas toujours rentable.

8
starblue

Comment puis-je éviter cet avertissement avec le langage Et non pas simplement en supprimant L'avertissement avec l'annotation SuppressWarnings.

L'annotation est le moyen d'éviter l'avertissement avec la langue. Il n'y a pas d'autre moyen.

2
Michael Borgwardt

Je suis tombé sur cette question alors que j'essayais également de trouver un moyen d'éviter d'utiliser l'annotation de suppression dans de tels cas. J'ai trouvé une autre alternative qui, à mon avis, méritait d'être mentionnée:

    Map<?, ?> map = servletRequest.getParameterMap();
    String[] values = (String[]) map.get("key");

Nous utilisons essentiellement un wildcard '?' pour indiquer que la carte peut avoir n'importe quel type de clé et de valeur. 

L’inconvénient potentiel, c’est que nous effectuons une conversion explicite lors de la récupération de valeurs, ce qui, à mon avis, entraînera une légère surcharge de performances lors de l’exécution.

1
Gaurav

J'ai eu le même problème, je viens de désactiver tous les avertissements génériques et je suis heureux :) Vous pouvez également désactiver l'avertissement serialVersionUID car de nombreuses personnes n'utilisent pas serialVersionUID.

dans Eclipse - Window/Perferences/Java/Compiler/Errors/Warnings et désactivez tous les types génériques.

P.S. Beaucoup de mauvais avertissements vous font ignorer tous les avertissements et certains peuvent être utiles.

1
IAdapter

Je ne pense pas que tu peux. L'avertissement apparaîtra à moins que vous ne le supprimiez ou ne le filtriez pas de la liste des avertissements de votre IDE.

1
Rich Seller

comme d'autres l'ont dit, le seul moyen de se débarrasser de cet avertissement est de le supprimer.

la meilleure pratique consiste à encapsuler l'avertissement à l'aide de méthodes et de classes.

mais avec les autres avertissements, essayez toujours de résoudre le problème qui les pose, comme supprimer les importations inutilisées, etc., cela rend votre application plus légère et plus performante.

codage heureux

0
Bardya Momeni