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

Например:

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

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

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

     List myList = new ArrayList(); 

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

     List myList = new ArrayList(); 

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

     List myList = new ArrayList<>(); 

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

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

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

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

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

     -Xlint:unchecked 

    получить подробности

    как это:

     javac YourFile.java -Xlint:unchecked Main.java:7: warning: [unchecked] unchecked cast clone.mylist = (ArrayList)this.mylist.clone(); ^ required: ArrayList found: Object 1 warning 

    docs.oracle.com рассказывает об этом здесь: http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html

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

    для функции

     List getNames() List names = obj.getNames(); 

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

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

     List names = obj.getNames(); 

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

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

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

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

     import java.io.Serializable; public class SimpleGenericClass implements Serializable { public Serializable getInstance() { return this; } // @SuppressWarnings("unchecked") public static void main() { SimpleGenericClass original = new SimpleGenericClass(); // java: unchecked cast // required: SimpleGenericClass // found: java.io.Serializable SimpleGenericClass returned = (SimpleGenericClass) original.getInstance(); } } 

    getInstance () возвращает объект, который реализует Serializable. Это должно быть отлито для фактического типа, но это непроверенный бросок.

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

    пример:

     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 filename = Arrays.asList(file); 

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

    Interesting Posts
    Давайте будем гением компьютера.