Na przykład:Co powoduje javac aby wydać „używa niezaznaczone lub niebezpiecznych operacji” Ostrzeżenie
javac Foo.java
Note: Foo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Na przykład:Co powoduje javac aby wydać „używa niezaznaczone lub niebezpiecznych operacji” Ostrzeżenie
javac Foo.java
Note: Foo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
ten pojawia się w Java 5 i później, jeśli używasz kolekcje bez specyfikatorów typu (np Arraylist()
zamiast ArrayList<String>()
). Oznacza to, że kompilator nie może sprawdzić, czy używasz kolekcji w bezpieczny sposób, używając generics.
Aby pozbyć się ostrzeżenia, po prostu określ, jaki rodzaj obiektów przechowujesz w kolekcji. Tak więc, zamiast
List myList = new ArrayList();
użytku
List<String> myList = new ArrayList<String>();
w Javie 7 można skrócić rodzajowy instancji za pomocą Type Inference.
List<String> myList = new ArrayList<>();
na przykład po wywołaniu funkcji zwracającej kolekcje ogólne i nie określa się samodzielnie ogólnych parametrów.
dla funkcji
List<String> getNames()
List names = obj.getNames();
wygeneruje ten błąd.
go rozwiązać byłoby po prostu dodać parametry
List<String> names = obj.getNames();
„Eksploatacja niesprawdzone lub niebezpieczne” ostrzeżenie dodano kiedy java dodaje Generics, jeśli dobrze pamiętam. Zazwyczaj wymaga od ciebie wyraźniejszego wyrażania się o typach.
Na przykład. kod ArrayList foo = new ArrayList();
wyzwala to ostrzeżenie, ponieważ javac szuka ArrayList<String> foo = new ArrayList<String>();
Jeśli zrobisz to, co sugeruje i przekompilujesz z przełącznikiem "-Xlint: niezaznaczony", to dostarczy ci bardziej szczegółowych informacji.
Oprócz użycia typów surowych (jak opisano w innych odpowiedziach), odznaczony rzut może również spowodować ostrzeżenie.
Po skompilowaniu z opcją -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żna zdecydować się tłumić ostrzeżenie w miejscach, gdzie wiesz, że kod jest prawidłowy:
@SuppressWarnings("unchecked")
public void myMethod()
{
//...
}
Życzę więcej ludzie przegłosują tę odpowiedź. Stoję po mojej selekcji odpowiedzi @Bill the Lizard, ale ta odpowiedź jest bliska mojemu sercu, ponieważ pokazał mi, że odpowiedź patrzy mi prosto w twarz w ostrzeżeniu, a także rozwija inny powód napotkania błędu. – toolbear
To jest ostateczna odpowiedź! – russellhoff
To ostrzeżenie oznacza, że kod działa od rodzaju surowca, skompilować przykład z
-Xlint:unchecked
aby uzyskać szczegóły
tak:
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.or acle.com mówi o tym tutaj: http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html
To nie dodaje wiele do już istniejących odpowiedzi. – Makoto
Myślę, że tak. Połączy się z dokumentacją Oracle w celu uzyskania tego dokładnego ostrzeżenia. –
Rozwiązaniem byłoby użycie określonego typu w <> jak ArrayList.
przykład:
File curfolder = new File("C:\\Users\\username\\Desktop"); File[] file = curfolder.listFiles(); ArrayList filename = Arrays.asList(file);
powyżej kodu generować ostrzeżenia ponieważ ArrayList nie ma określonego typu.
File curfolder = new File("C:\\Users\\username\\Desktop"); File[] file = curfolder.listFiles(); ArrayList<File> filename = Arrays.asList(file);
powyższy kod zrobi dobrze. Zmiana następuje tylko w trzeciej linii po tablicy ArrayList.
Po prostu chcę dodać jeden przykład tego rodzaju niezaznaczonego ostrzeżenia, które widzę dość często. Jeśli używasz klas implementujących interfejs taki jak Serializable, często będziesz wywoływał metody, które zwracają obiekty interfejsu, a nie rzeczywistą klasę. Jeśli zwrócona klasa musi być rzutowana na typ oparty na rodzajach ogólnych, możesz otrzymać to ostrzeżenie.
Oto krótki (i nieco głupie) przykład wykazać:
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ć rzutowany na rzeczywisty typ, ale jest to niezaznaczona obsada.
W języku Java 7 otrzymałem to samo ostrzeżenie, nawet używając opcji * Typ zakłóceń * z tą kolekcją: 'ConcurrentHashMap objs = new ConcurrentHashMap()' –
Lucio
@Lucio Nadal potrzebujesz nawiasów ostrych. 'new ConcurrentHashMap <>()' –
Wystarczy zaznaczyć, że 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 tworzone z następującym kodem: AbstractMap.SimpleEntry entry = new AbstractMap.SimpleEntry ("hello", "world"); –
semonte