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 =newArrayList();
posługiwać się
List<String> myList =newArrayList<String>();
W Javie 7 możesz skrócić tworzenie instancji za pomocą wnioskowania typu .
W Javie 7 otrzymałem to samo ostrzeżenie, nawet używając Interferencji typu w tej kolekcji:ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
Lucio
13
@Lucio Nadal potrzebujesz nawiasów kątowych. new ConcurrentHashMap<>()
Bill the Lizard
3
Dla przypomnienia, nie jest to specyficzne dla kolekcji. Wystąpił błąd, ponieważ kompilator Java nie może ogólnie zapewnić bezpieczeństwa typu. Na przykład to samo ostrzeżenie jest generowane przy użyciu następującego kodu: AbstractMap.SimpleEntry <String, String> entry = new AbstractMap.SimpleEntry („hello”, „world”);
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:
Chciałbym, aby więcej osób głosowało za odpowiedzią. Opowiadam się za wyborem odpowiedzi @Bill Jaszczurka, ale ta odpowiedź jest mi bliska, ponieważ pokazał mi, że odpowiedź wpatrywała się we mnie w samo ostrzeżenie, a także opracował kolejny powód napotkania błędu.
toolbear
1
To jest ostateczna odpowiedź!
russellhoff,
Ta odpowiedź powinna była zostać oznaczona jako rozwiązanie! Dzięki!
dzięki, znalazłem skąd pochodzi moje ostrzeżenie, dodając to
JackOuttaBox
Dostaję to ostrzeżenie i AS pokazuje klasę, w której został wyprodukowany. I to nie jest błąd, tylko ostrzeżenie. Dlaczego powinniśmy dodać tę opcję? Czy w Twojej sytuacji nie pokazano klasy problemów?
CoolMind
Lol, po prostu odpowiadam na pytanie i nie , problem nie jest pokazywany, dopóki go nie dodasz.
Borzh
16
To ostrzeżenie oznacza, że Twój kod działa na typie raw, ponownie skompiluj przykład z
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;publicclassSimpleGenericClass<T>implementsSerializable{publicSerializable getInstance(){returnthis;}// @SuppressWarnings("unchecked")publicstaticvoid main(){SimpleGenericClass<String> original =newSimpleGenericClass<String>();// java: unchecked cast// required: SimpleGenericClass<java.lang.String>// found: java.io.SerializableSimpleGenericClass<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.
Możesz zachować go w formie ogólnej i zapisać jako:
// list 2 is made generic and can store any type of ObjectArrayList<Object> list2 =newArrayList<Object>();
Ustawienie typu ArrayList jako Object daje nam korzyść w zakresie przechowywania dowolnego rodzaju danych. Nie musisz używać -Xlint ani niczego innego.
Mam ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;. Ponieważ valuejest 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:
sun.misc.Unsafe
Odpowiedzi:
Pojawia się to w Javie 5 i nowszych, jeśli używasz kolekcji bez specyfikatorów typów (np.
Arraylist()
ZamiastArrayList<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
posługiwać się
W Javie 7 możesz skrócić tworzenie instancji za pomocą wnioskowania typu .
źródło
ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
new ConcurrentHashMap<>()
-Xlint:unchecked
z MAVENJeś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:
źródło
W przypadku Androida Studio musisz dodać:
w pliku build.gradle projektu, aby dowiedzieć się, gdzie występuje ten błąd.
źródło
To ostrzeżenie oznacza, że Twój kod działa na typie raw, ponownie skompiluj przykład z
aby uzyskać szczegółowe informacje
lubię to:
docs.oracle.com mówi o tym tutaj: http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html
źródło
Miałem 2-letnie klasy i kilka nowych klas. Rozwiązałem go w Android Studio w następujący sposób:
W moim projekcie plik build.gradle ( rozwiązanie Borzha )
A jeśli pozostaną jakieś Metheds:
źródło
na przykład, gdy wywołujesz funkcję, która zwraca Kolekcje ogólne i nie określasz parametrów ogólnych samodzielnie.
dla funkcji
wygeneruje ten błąd.
Aby to rozwiązać, wystarczy dodać parametry
źródło
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>();
źródło
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ć:
getInstance () zwraca obiekt, który implementuje Serializable. To musi być rzutowane na rzeczywisty typ, ale jest to rzut niezaznaczony.
źródło
Rozwiązaniem byłoby użycie określonego typu w
<>
podobny sposóbArrayList<File>
.przykład:
powyższy kod generuje ostrzeżenie, ponieważ
ArrayList
nie jest określonego typu.powyższy kod będzie w porządku. Tylko zmiana jest w trzeciej linii po
ArrayList
.źródło
Możesz zachować go w formie ogólnej i zapisać jako:
Ustawienie typu ArrayList jako Object daje nam korzyść w zakresie przechowywania dowolnego rodzaju danych. Nie musisz używać -Xlint ani niczego innego.
źródło
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 <> ()
źródło
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:źródło