Na przykład:
javac Foo.java
Note: Foo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Na przykład:
javac Foo.java
Note: Foo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Odpowiedzi:
Pojawia się to w Javie 5 i nowszych, jeśli używasz kolekcji bez specyfikatorów typów (np. Arraylist()
Zamiast ArrayList<String>()
). Oznacza to, że kompilator nie może sprawdzić, czy używasz kolekcji w sposób bezpieczny dla typu, używając ogólnych .
Aby pozbyć się ostrzeżenia, sprecyzuj, jakiego rodzaju obiekty przechowujesz w kolekcji. Więc zamiast
List myList = new ArrayList();
posługiwać się
List<String> myList = new ArrayList<String>();
W Javie 7 możesz skrócić tworzenie instancji za pomocą wnioskowania typu .
List<String> myList = new ArrayList<>();
ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
new ConcurrentHashMap<>()
-Xlint:unchecked
z MAVEN
Jeśli zrobisz to, co sugeruje i zrekompilujesz za pomocą przełącznika „-Xlint: unchecked”, dostarczy ci bardziej szczegółowych informacji.
Oprócz użycia surowych typów (jak opisano w innych odpowiedziach), niezaznaczone rzutowanie może również powodować ostrzeżenie.
Po skompilowaniu z -Xlint powinieneś być w stanie przerobić swój kod, aby uniknąć ostrzeżenia. Nie zawsze jest to możliwe, szczególnie jeśli integrujesz się ze starszym kodem, którego nie można zmienić. W tej sytuacji możesz zdecydować o pominięciu ostrzeżenia w miejscach, w których wiesz, że kod jest poprawny:
@SuppressWarnings("unchecked")
public void myMethod()
{
//...
}
W przypadku Androida Studio musisz dodać:
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked"
}
}
// ...
}
w pliku build.gradle projektu, aby dowiedzieć się, gdzie występuje ten błąd.
To ostrzeżenie oznacza, że Twój kod działa na typie raw, ponownie skompiluj przykład z
-Xlint:unchecked
aby uzyskać szczegółowe informacje
lubię to:
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 mówi o tym tutaj: http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html
Miałem 2-letnie klasy i kilka nowych klas. Rozwiązałem go w Android Studio w następujący sposób:
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked"
}
}
}
W moim projekcie plik build.gradle ( rozwiązanie Borzha )
A jeśli pozostaną jakieś Metheds:
@SuppressWarnings("unchecked")
public void myMethod()
{
//...
}
Ostrzeżenie „niesprawdzone lub niebezpieczne operacje” zostało dodane, gdy Java dodała Generics , jeśli dobrze pamiętam. Zwykle prosi o wyraźniejsze określenie typów, w taki czy inny sposób.
Na przykład. kod ArrayList foo = new ArrayList();
wyzwala to ostrzeżenie, ponieważ szuka javacArrayList<String> foo = new ArrayList<String>();
Chcę tylko dodać jeden przykład tego rodzaju niesprawdzonego ostrzeżenia, które często widuję. Jeśli używasz klas, które implementują interfejs taki jak Serializable, często wywołujesz metody zwracające obiekty interfejsu, a nie rzeczywistą klasę. Jeśli zwracana klasa musi być rzutowana na typ oparty na ogólnych, możesz otrzymać to ostrzeżenie.
Oto krótki (i nieco głupi) przykład, aby zademonstrować:
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 () zwraca obiekt, który implementuje Serializable. To musi być rzutowane na rzeczywisty typ, ale jest to rzut niezaznaczony.
Rozwiązaniem byłoby użycie określonego typu w <>
podobny sposób ArrayList<File>
.
przykład:
File curfolder = new File( "C:\\Users\\username\\Desktop");
File[] file = curfolder.listFiles();
ArrayList filename = Arrays.asList(file);
powyższy kod generuje ostrzeżenie, ponieważ ArrayList
nie jest określonego typu.
File curfolder = new File( "C:\\Users\\username\\Desktop");
File[] file = curfolder.listFiles();
ArrayList<File> filename = Arrays.asList(file);
powyższy kod będzie w porządku. Tylko zmiana jest w trzeciej linii po ArrayList
.
Możesz zachować go w formie ogólnej i zapisać jako:
// list 2 is made generic and can store any type of Object
ArrayList<Object> list2 = new ArrayList<Object>();
Ustawienie typu ArrayList jako Object daje nam korzyść w zakresie przechowywania dowolnego rodzaju danych. Nie musisz używać -Xlint ani niczego innego.
To ostrzeżenie może zostać również podniesione z powodu
new HashMap () lub new ArrayList (), który jest typem ogólnym, musi być specyficzny, w przeciwnym razie kompilator wygeneruje ostrzeżenie.
Upewnij się, że jeśli kod zawiera następujące elementy, musisz odpowiednio zmienić
new HashMap () => Mapa mapy = nowy HashMap () nowy HashMap () => Mapa mapy = nowy HashMap <> ()
new ArrayList () => List map = new ArrayList () new ArrayList () => Map list = new ArrayList <> ()
Mam ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;
. Ponieważ value
jest to złożona struktura (chcę wyczyścić JSON ), mogą się zdarzyć dowolne kombinacje liczb, boolanów, ciągów znaków, tablic. Użyłem więc rozwiązania @Dan Dyer:
@SuppressWarnings("unchecked")
ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;
sun.misc.Unsafe