2008-10-13 10 views

Odpowiedz

287

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<>(); 
+0

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

+8

@Lucio Nadal potrzebujesz nawiasów ostrych. 'new ConcurrentHashMap <>()' –

+3

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

5

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(); 
5

„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>();

151

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() 
{ 
    //... 
} 
+10

Ż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

+0

To jest ostateczna odpowiedź! – russellhoff

10

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

+0

To nie dodaje wiele do już istniejących odpowiedzi. – Makoto

+0

Myślę, że tak. Połączy się z dokumentacją Oracle w celu uzyskania tego dokładnego ostrzeżenia. –

0

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.

1

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.