Comment éviter les avertissements de fonte non vérifiés avec Java Generics

D’une certaine manière, ma vieille question était close, alors j’en ouvre une nouvelle:

J’utilise Java Generics pour implémenter une carte de hachage générique bidirectionnelle à partir d’une requête SQL. Il devrait être capable de mapper n’importe quelle combinaison de paires Ssortingng, Integer dans les deux sens. Il devrait être utilisé comme ceci:

Ssortingng sql = "SELECT ssortingng_val, int_val FROM map_table"; PickMap pm1 = new PickMap(sql); Ssortingng key1 = "seven"; Integer value1 = pm1.getLeft2Right(key1); Integer key2 = 7; Ssortingng value2 = pm1.getRightToLeft(key2); 

Bien sûr, il devrait être possible de créer un pm (Integer, Integer) et ainsi de suite …

Mon implémentation de Pick Map ressemble à ceci (sans le getter …):

 public class PickMap { private final HashMap left2Right = new HashMap(); private final HashMap right2Left = new HashMap(); public PickMap(Ssortingng sql) throws OException { DTable d = new DTable(sql); int colTypeL = dtgetColType(1); int colTypeR = dtgetColType(2); Extractor extLeft = (Extractor) getInstance(colTypeL); Extractor extRight = (Extractor) getInstance(colTypeR); int numRows = dtgetNumRows(); for(int i=1;i<=numRows;i++) { L leftVal = extLeft.extract(d, i); R rightVal = extRight.extract(d, i); this.left2Right.put(leftVal, rightVal); this.right2Left.put(rightVal, leftVal); } } private Extractor getInstance(int type) { if(type == 1) return new IntExtractor(); else return new SsortingngExtractor(); } } interface Extractor { E extract(DTable source, int row); } class IntExtractor implements Extractor { @Override public Integer extract(DTable source, int row) { int value = 5; return new Integer(value); } } class SsortingngExtractor implements Extractor { @Override public Ssortingng extract(DTable source, int row) { Ssortingng retVal = "hello"; return retVal; } } 

Je n’ai pas d’erreurs de compilation et je suis sûr que cela fonctionnera de cette façon. MAIS je reçois des avertissements de diffusion non vérifiés sur les méthodes “getInstance” Où je lance Extractor (E) à Extractor (L) …

Comment devrais-je lancer correctement? Ou qu’est-ce qui me manque? Ou devrais-je simplement supprimer ces avertissements?

Vous recevez des avertissements car ce que vous faites ne peut être prouvé comme étant sûr. Vous supposez que getInstance(colTypeL) renverra un Extractor – mais cela ne peut pas être vérifié au moment de la compilation ou de l’exécution.

Vous pouvez utiliser @SuppressWarnings("unchecked") comme mentionné par d’autres, mais j’essaierais de repenser un peu le design.

Vous pouvez utiliser les annotations suivantes pour que le compilateur ne génère pas ces avertissements:

 @SuppressWarnings("unchecked") 

Voir cette question connexe qui traite du même problème. La réponse expliquera tout ce que vous devez savoir.