Par exemple:
javac Foo.java
Note: Foo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Par exemple:
javac Foo.java
Note: Foo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Réponses:
Cela apparaît dans Java 5 et versions ultérieures si vous utilisez des collections sans spécificateurs de type (par exemple, Arraylist()
au lieu de ArrayList<String>()
). Cela signifie que le compilateur ne peut pas vérifier que vous utilisez la collection de manière sécurisée, en utilisant des génériques .
Pour vous débarrasser de l'avertissement, précisez simplement quel type d'objets vous stockez dans la collection. Donc, au lieu de
List myList = new ArrayList();
utilisation
List<String> myList = new ArrayList<String>();
Dans Java 7, vous pouvez raccourcir l'instanciation générique à l'aide de l' inférence de type .
List<String> myList = new ArrayList<>();
ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
new ConcurrentHashMap<>()
-Xlint:unchecked
avec MAVEN
Si vous faites ce qu'il suggère et recompilez avec le commutateur "-Xlint: unchecked", il vous donnera des informations plus détaillées.
En plus de l'utilisation de types bruts (comme décrit par les autres réponses), un cast non contrôlé peut également provoquer l'avertissement.
Une fois que vous avez compilé avec -Xlint, vous devriez pouvoir retravailler votre code pour éviter l'avertissement. Ce n'est pas toujours possible, en particulier si vous intégrez avec du code hérité qui ne peut pas être modifié. Dans cette situation, vous pouvez décider de supprimer l'avertissement aux endroits où vous savez que le code est correct:
@SuppressWarnings("unchecked")
public void myMethod()
{
//...
}
Pour Android Studio, vous devez ajouter:
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked"
}
}
// ...
}
dans le fichier build.gradle de votre projet pour savoir où cette erreur est produite.
Cet avertissement signifie que votre code fonctionne sur un type brut, recompilez l'exemple avec le
-Xlint:unchecked
pour obtenir les détails
comme ça:
javac YourFile.java -Xlint:unchecked
Main.java:7: warning: [unchecked] unchecked cast
clone.mylist = (ArrayList<String>)this.mylist.clone();
^
required: ArrayList<String>
found: Object
1 warning
docs.oracle.com en parle ici: http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html
J'avais des classes de 2 ans et quelques nouvelles classes. Je l'ai résolu dans Android Studio comme suit:
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked"
}
}
}
Dans mon projet fichier build.gradle ( solution Borzh )
Et puis s'il reste quelques Metheds:
@SuppressWarnings("unchecked")
public void myMethod()
{
//...
}
par exemple, lorsque vous appelez une fonction qui renvoie des collections génériques et que vous ne spécifiez pas vous-même les paramètres génériques.
pour une fonction
List<String> getNames()
List names = obj.getNames();
générera cette erreur.
Pour le résoudre, il vous suffit d'ajouter les paramètres
List<String> names = obj.getNames();
L'avertissement "opérations non contrôlées ou non sécurisées" a été ajouté lorsque java a ajouté des génériques , si je me souviens bien. Cela vous demande généralement d'être plus explicite sur les types, d'une manière ou d'une autre.
Par exemple. le code ArrayList foo = new ArrayList();
déclenche cet avertissement car javac rechercheArrayList<String> foo = new ArrayList<String>();
Je veux juste ajouter un exemple du type d'avertissement non contrôlé que je vois assez souvent. Si vous utilisez des classes qui implémentent une interface comme Serializable, vous appellerez souvent des méthodes qui renvoient des objets de l'interface, et non la classe réelle. Si la classe renvoyée doit être convertie en un type basé sur des génériques, vous pouvez obtenir cet avertissement.
Voici un exemple bref (et quelque peu stupide) à démontrer:
import java.io.Serializable;
public class SimpleGenericClass<T> implements Serializable {
public Serializable getInstance() {
return this;
}
// @SuppressWarnings("unchecked")
public static void main() {
SimpleGenericClass<String> original = new SimpleGenericClass<String>();
// java: unchecked cast
// required: SimpleGenericClass<java.lang.String>
// found: java.io.Serializable
SimpleGenericClass<String> returned =
(SimpleGenericClass<String>) original.getInstance();
}
}
getInstance () renvoie un objet qui implémente Serializable. Cela doit être converti en type réel, mais il s'agit d'un cast non contrôlé.
La solution serait d'utiliser un type spécifique <>
comme ArrayList<File>
.
exemple:
File curfolder = new File( "C:\\Users\\username\\Desktop");
File[] file = curfolder.listFiles();
ArrayList filename = Arrays.asList(file);
le code ci-dessus génère un avertissement car il ArrayList
n'est pas de type spécifique.
File curfolder = new File( "C:\\Users\\username\\Desktop");
File[] file = curfolder.listFiles();
ArrayList<File> filename = Arrays.asList(file);
le code ci-dessus fera l'affaire. Seul le changement est en troisième ligne après ArrayList
.
Vous pouvez le conserver sous forme générique et l'écrire comme:
// list 2 is made generic and can store any type of Object
ArrayList<Object> list2 = new ArrayList<Object>();
La définition du type de ArrayList comme Object nous donne l'avantage de stocker tout type de données. Vous n'avez pas besoin d'utiliser -Xlint ou autre chose.
Cet avertissement pourrait également être
new HashMap () ou new ArrayList () qui est de type générique doit être spécifique sinon le compilateur générera un avertissement.
Veuillez vous assurer que si votre code contient les éléments suivants, vous devez les modifier en conséquence
new HashMap () => Map map = new HashMap () new HashMap () => Map map = new HashMap <> ()
new ArrayList () => List map = new ArrayList () new ArrayList () => List map = new ArrayList <> ()
Je l'ai ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;
. Parce que value
c'est une structure complexe (je veux nettoyer JSON ), il peut se produire n'importe quelle combinaison sur des nombres, des booléens, des chaînes, des tableaux. J'ai donc utilisé la solution de @Dan Dyer:
@SuppressWarnings("unchecked")
ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;
sun.misc.Unsafe
et cela donne ces conseils sur la sortie