Risposte:
Questo si presenta in Java 5 e versioni successive se si utilizzano raccolte senza identificatori di tipo (ad esempio, Arraylist()
anziché ArrayList<String>()
). Significa che il compilatore non può verificare che stai usando la raccolta in un modo sicuro, usando generici .
Per eliminare l'avvertimento, basta essere specifici sul tipo di oggetti che si stanno archiviando nella raccolta. Quindi, invece di
List myList = new ArrayList();
uso
List<String> myList = new ArrayList<String>();
In Java 7 è possibile abbreviare l'istanza generica utilizzando Tipo Inferenza .
List<String> myList = new ArrayList<>();
ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
new ConcurrentHashMap<>()
-Xlint:unchecked
con MAVEN
Se fai ciò che suggerisce e ricompila con l'opzione "-Xlint: unchecked", ti darà informazioni più dettagliate.
Oltre all'uso di tipi non elaborati (come descritto dalle altre risposte), un cast non controllato può anche causare l'avvertimento.
Una volta compilato con -Xlint, dovresti essere in grado di rielaborare il codice per evitare l'avvertimento. Questo non è sempre possibile, in particolare se si sta integrando un codice legacy che non può essere modificato. In questa situazione, puoi decidere di sopprimere l'avviso in luoghi in cui sai che il codice è corretto:
@SuppressWarnings("unchecked")
public void myMethod()
{
//...
}
Per Android Studio, devi aggiungere:
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked"
}
}
// ...
}
nel file build.gradle del progetto per sapere dove viene prodotto questo errore.
Questo avviso indica che il codice funziona su un tipo non elaborato, ricompilare l'esempio con
-Xlint:unchecked
per ottenere i dettagli
come questo:
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 ne parla qui: http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html
Avevo lezioni di 2 anni e alcune nuove lezioni. L'ho risolto in Android Studio come segue:
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked"
}
}
}
Nel mio progetto build.gradle file ( soluzione Borzh )
E poi se rimangono alcuni Metheds:
@SuppressWarnings("unchecked")
public void myMethod()
{
//...
}
ad esempio quando chiamate una funzione che restituisce Collezioni generiche e non specificate voi stessi i parametri generici.
per una funzione
List<String> getNames()
List names = obj.getNames();
genererà questo errore.
Per risolverlo basta aggiungere i parametri
List<String> names = obj.getNames();
L'avviso "operazioni non controllate o non sicure" è stato aggiunto quando java ha aggiunto Generics , se ricordo bene. Di solito ti chiede di essere più esplicito sui tipi, in un modo o nell'altro.
Per esempio. il codice ArrayList foo = new ArrayList();
attiva questo avviso perché javac sta cercandoArrayList<String> foo = new ArrayList<String>();
Voglio solo aggiungere un esempio del tipo di avviso non controllato che vedo abbastanza spesso. Se usi classi che implementano un'interfaccia come Serializable, spesso chiamerai metodi che restituiscono oggetti dell'interfaccia e non la classe effettiva. Se è necessario eseguire il cast della classe restituita su un tipo basato su generici, è possibile ricevere questo avviso.
Ecco un breve (e un po 'sciocco) esempio da dimostrare:
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 () restituisce un oggetto che implementa Serializable. Deve essere eseguito il cast sul tipo effettivo, ma si tratta di un cast non controllato.
La soluzione sarebbe usare un tipo specifico in <>
like ArrayList<File>
.
esempio:
File curfolder = new File( "C:\\Users\\username\\Desktop");
File[] file = curfolder.listFiles();
ArrayList filename = Arrays.asList(file);
sopra il codice genera un avviso perché ArrayList
non è di tipo specifico.
File curfolder = new File( "C:\\Users\\username\\Desktop");
File[] file = curfolder.listFiles();
ArrayList<File> filename = Arrays.asList(file);
sopra il codice andrà bene. Solo il cambiamento è in terza riga dopo ArrayList
.
Puoi tenerlo nel modulo generico e scriverlo come:
// list 2 is made generic and can store any type of Object
ArrayList<Object> list2 = new ArrayList<Object>();
L'impostazione del tipo di ArrayList su Object ci offre il vantaggio di archiviare qualsiasi tipo di dati. Non è necessario utilizzare -Xlint o altro.
Questo avviso potrebbe anche essere sollevato a causa di
nuovo HashMap () o nuovo ArrayList () di tipo generico deve essere specifico, altrimenti il compilatore genererà un avviso.
Assicurati che se il codice contiene quanto segue devi cambiare di conseguenza
new HashMap () => Map map = new HashMap () new HashMap () => Map map = new HashMap <> ()
new ArrayList () => Map list = new ArrayList () new ArrayList () => List map = new ArrayList <> ()
Io ho ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;
. Poiché value
è una struttura complessa (voglio pulire JSON ), possono verificarsi combinazioni di numeri, valori booleani, stringhe, array. Quindi, ho usato la soluzione di @Dan Dyer:
@SuppressWarnings("unchecked")
ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;
sun.misc.Unsafe
e sta dando questi suggerimenti all'output