Что заставляет javac выдавать предупреждение «использует непроверенные или небезопасные операции» - PullRequest
259 голосов
/ 13 октября 2008

Например:

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

Ответы [ 8 ]

358 голосов
/ 13 октября 2008

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

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

List myList = new ArrayList();

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

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

В Java 7 вы можете сократить общее создание экземпляров, используя Вывод типа .

List<String> myList = new ArrayList<>();
180 голосов
/ 13 октября 2008

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

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

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

@SuppressWarnings("unchecked")
public void myMethod()
{
    //...
}
14 голосов
/ 28 мая 2014

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

-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

11 голосов
/ 12 ноября 2018

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

allprojects {

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

    // ...
}

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

5 голосов
/ 13 октября 2008

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

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

5 голосов
/ 13 октября 2008

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

для функции

List<String> getNames()


List names = obj.getNames();

сгенерирует эту ошибку.

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

List<String> names = obj.getNames();
2 голосов
/ 08 апреля 2015

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

0 голосов
/ 18 сентября 2014

Решением будет использование определенного типа в <>, например 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.

...