355 Stimmen

Was führt dazu, dass javac die Warnung "uses unchecked or unsafe operations" ausgibt

Zum Beispiel:

javac Foo.java
Note: Foo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

4voto

Matt Punkte 2226

Zum Beispiel, wenn Sie eine Funktion aufrufen, die generische Sammlungen zurückgibt und Sie die generischen Parameter nicht selbst angeben.

für eine Funktion

List<String> getNames()

List names = obj.getNames();

wird diesen Fehler erzeugen.

Um dieses Problem zu lösen, fügen Sie einfach die Parameter

List<String> names = obj.getNames();

4voto

Ryan Punkte 9860

Die Warnung "Ungeprüfte oder unsichere Operationen" wurde hinzugefügt, als Java die Generika wenn ich mich richtig erinnere. Es ist in der Regel fragen Sie explizit über Typen, in der einen oder anderen Weise zu sein.

Zum Beispiel. der Code ArrayList foo = new ArrayList(); löst diese Warnung aus, weil javac nach ArrayList<String> foo = new ArrayList<String>();

3voto

Michael Levy Punkte 12887

Ich möchte nur ein Beispiel für die Art von ungeprüften Warnungen anführen, die ich häufig sehe. Wenn Sie Klassen verwenden, die eine Schnittstelle wie Serializable implementieren, rufen Sie oft Methoden auf, die Objekte der Schnittstelle zurückgeben, und nicht die eigentliche Klasse. Wenn die Klasse, die zurückgegeben wird, in einen Typ gecastet werden muss, der auf Generics basiert, können Sie diese Warnung erhalten.

Hier ist ein kurzes (und etwas albernes) Beispiel zur Veranschaulichung:

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() gibt ein Objekt zurück, das Serializable implementiert. Dieses muss auf den tatsächlichen Typ gecastet werden, aber dies ist ein ungeprüfter Cast.

1voto

Julius Punkte 1

Die Lösung wäre die Verwendung eines bestimmten Typs in <> wie ArrayList<File> .

Beispiel:

File curfolder = new File( "C:\\Users\\username\\Desktop");
File[] file = curfolder.listFiles();
ArrayList filename = Arrays.asList(file);

obiger Code erzeugt eine Warnung, weil ArrayList nicht von einem bestimmten Typ ist.

File curfolder = new File( "C:\\Users\\username\\Desktop");
File[] file = curfolder.listFiles();
ArrayList<File> filename = Arrays.asList(file);

Der obige Code reicht aus. Die einzige Änderung ist in der dritten Zeile nach ArrayList .

0voto

Mayukh Datta Punkte 71

Sie können die allgemeine Form beibehalten und sie wie folgt schreiben:

// list 2 is made generic and can store any type of Object
        ArrayList<Object> list2 = new ArrayList<Object>();

Die Einstellung des Typs von ArrayList als Object gibt uns den Vorteil, jede Art von Daten zu speichern. Sie brauchen nicht -Xlint oder etwas anderes zu verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X