Что заставляет javac выдавать предупреждение "использует непроверенные или небезопасные операции"

Например:

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

Ответ 1

Это появляется в Java 5 и более поздних версиях, если вы используете коллекции без спецификаторов типов (например, Arraylist() вместо ArrayList<String>()). Это означает, что компилятор не может проверить, что вы используете коллекцию безопасным способом, используя generics.

Чтобы избавиться от предупреждения, просто укажите, какой тип объектов вы храните в коллекции. Итак, вместо

List myList = new ArrayList();

использование

List<String> myList = new ArrayList<String>();

В Java 7 вы можете сократить общий экземпляр с помощью Type Inference.

List<String> myList = new ArrayList<>();

Ответ 2

Если вы сделаете то, что предлагает, и перекомпилируйте с помощью переключателя -Xlint: unchecked, он предоставит вам более подробную информацию.

Помимо использования типов raw (как описано в других ответах), неконтролируемый актерский состав также может вызывать предупреждение.

После того, как вы скомпилировали с помощью -Xlint, вы должны усовершенствовать свой код, чтобы избежать предупреждения. Это не всегда возможно, особенно если вы интегрируетесь с устаревшим кодом, который нельзя изменить. В этой ситуации вы можете запретить предупреждение в тех местах, где вы знаете, что код верен:

@SuppressWarnings("unchecked")
public void myMethod()
{
    //...
}

Ответ 3

Это предупреждение означает, что ваш код работает на необработанном типе, перекомпилируйте пример с помощью

-Xlint:unchecked 

чтобы получить информацию

вот так:

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 рассказывает об этом здесь: http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html

Ответ 4

Для Android Studio вам нужно добавить:

allprojects {

    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:unchecked"
        }
    }

    // ...
}

в вашем проекте файл build.gradle, чтобы знать, где эта ошибка возникает.

Ответ 5

например, когда вы вызываете функцию, которая возвращает Generic Collections, и вы сами не указываете общие параметры.

для функции

List<String> getNames()


List names = obj.getNames();

будет генерировать эту ошибку.

Чтобы решить эту проблему, вы просто добавите параметры

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

Ответ 6

Предупреждение "непроверенные или опасные операции" было добавлено, когда java добавил Generics, если я правильно помню. Обычно он просит вас более четко описывать типы, так или иначе.

Например. код ArrayList foo = new ArrayList(); вызывает это предупреждение, потому что javac ищет ArrayList<String> foo = new ArrayList<String>();

Ответ 7

Я просто хочу добавить один пример такого непроверенного предупреждения, которое я вижу довольно часто. Если вы используете классы, реализующие интерфейс типа Serializable, часто вы будете вызывать методы, возвращающие объекты интерфейса, а не фактический класс. Если возвращаемый класс должен быть применен к типу, основанному на дженериках, вы можете получить это предупреждение.

Вот краткий (и несколько глупый) пример, демонстрирующий:

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() возвращает объект, который реализует Serializable. Это должно быть отлито для фактического типа, но это неконтролируемый отбор.

Ответ 8

Решением будет использование определенного типа в <> как ArrayList<File>.

пример:

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

над кодом генерирует предупреждение, потому что ArrayList не имеет определенного типа.

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

выше код будет хорошо. Только изменение происходит в третьей строке после ArrayList.

Ответ 9

Вы можете сохранить его в общей форме и записать как:

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

Установка типа ArrayList в качестве объекта дает нам преимущество для хранения данных любого типа. Вам не нужно использовать -Xlint или что-либо еще.

Ответ 10

У меня было 2 года классов и несколько новых классов. Я решил это в Android Studio следующим образом:

allprojects {

    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:unchecked"
        }
    }

}

В моем проекте файл build.gradle(Борж решение)

И потом, если осталось несколько Метедов:

@SuppressWarnings("unchecked")
public void myMethod()
{
    //...
}