Unchecked Cast en Java

Rupam Yadav 12 octobre 2023
  1. Qu’est-ce que l’avertissement de diffusion non contrôlé en Java
  2. Ignorez les avertissements à l’aide de @SuppressWarnings
Unchecked Cast en Java

Java est un langage de programmation qui applique la sécurité des types, ce qui signifie que nous devons toujours spécifier le type de données que nous allons stocker ou utiliser et que nous ne pouvons pas y stocker de types incompatibles.

Par exemple, nous ne pouvons pas stocker une valeur entière dans une chaîne, et le compilateur lancera une erreur ou un avertissement. L’un des avertissements liés aux types de données est le cast non vérifié.

Qu’est-ce que l’avertissement de diffusion non contrôlé en Java

L’avertissement de cast non vérifié se produit lorsque nous essayons un type brut vers un type paramétré sans vérifier son type. Java n’encourage pas cette méthode car un type paramétré est limité à un type spécifié uniquement.

L’un des types paramétrés en Java est HashMap, qui prend deux paramètres, le type key et le type value. Dans l’exemple de code ci-dessous, nous créons un objet de HashMap appelé rawMap et y mettons des valeurs avec leurs clés.

Lorsque nous compilons ce programme, quelques avertissements s’affichent, comme ceux indiqués ci-dessous. Les deux premiers avertissements se produisent car nous utilisons les classes paramétrées Map et HashMap en tant que raw.

Les trois derniers avertissements concernent chaque instruction put individuelle dans le programme car nous mettons des valeurs sans spécifier leur type ni vérifier le type ; ainsi, l’avertissement de casting non contrôlé arrive.

import java.util.HashMap;
import java.util.Map;

public class Main {
  public static void main(String[] args) {
    Map rawMap = new HashMap();
    rawMap.put("key1", "String1");
    rawMap.put("key2", "String2");
    rawMap.put("key3", "String3");

    System.out.println(rawMap);
  }
}

Production :

{key1=String1, key2=String2, key3=String3}

Mises en garde:

Raw use of parameterized class 'Map'
Raw use of parameterized class 'HashMap'
Unchecked call to 'put(K, V)' as a member of raw type 'java.util.Map'
Unchecked call to 'put(K, V)' as a member of raw type 'java.util.Map'
Unchecked call to 'put(K, V)' as a member of raw type 'java.util.Map'

Maintenant que nous connaissons le problème réel, nous pouvons discuter des solutions ou des solutions de contournement à ce problème.

Ignorez les avertissements à l’aide de @SuppressWarnings

Nous pouvons utiliser l’annotation @SupressWarnings si nous voulons ignorer les avertissements. C’est une bonne solution, mais seulement lorsque nous savons qu’il n’y aura aucun problème concernant cet avertissement à l’avenir.

Pour utiliser cette annotation, nous avons passé l’avertissement que nous voulons supprimer, qui est “décoché”. Nous utilisons cette annotation sur la fonction à partir de laquelle l’avertissement est généré.

Ci-dessous se trouve le même programme que celui que nous voyons dans l’exemple précédent, mais nous utilisons l’annotation @SuppressWarnings sur la fonction main() et y passons unchecked. Notez que le HashMap est toujours utilisé en tant que type brut, mais les avertissements ont disparu lorsque nous le compilons.

import java.util.HashMap;
import java.util.Map;

public class Main {
  @SuppressWarnings("unchecked")
  public static void main(String[] args) {
    Map rawMap = new HashMap();
    rawMap.put("key1", "String1");
    rawMap.put("key2", "String2");
    rawMap.put("key3", "String3");

    System.out.println(rawMap);
  }
}

Production :

{key1=String1, key2=String2, key3=String3}

Mises en garde:

Raw use of parameterized class 'Map'
Raw use of parameterized class 'HashMap'

Une autre solution évidente à ce problème consiste à utiliser le type paramétré HashMap comme il est censé l’être. Dans l’exemple suivant, nous spécifions le type et la valeur de la clé dans le HashMap, et les avertissements ont disparu.

import java.util.HashMap;
import java.util.Map;

public class Main {
  public static void main(String[] args) {
    Map<String, String> rawMap = new HashMap<>();
    rawMap.put("key1", "String1");
    rawMap.put("key2", "String2");
    rawMap.put("key3", "String3");

    System.out.println(rawMap);
  }
}

Production :

{key1=String1, key2=String2, key3=String3}
Auteur: Rupam Yadav
Rupam Yadav avatar Rupam Yadav avatar

Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.

LinkedIn