Например:
javac Foo.java
Note: Foo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Например:
javac Foo.java
Note: Foo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Это появляется в 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<>();
Если вы сделаете то, что предлагает, и перекомпилируйте с помощью переключателя -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<String>)this.mylist.clone();
^
required: ArrayList<String>
found: Object
1 warning
docs.oracle.com рассказывает об этом здесь: http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html
Для Android Studio вам нужно добавить:
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked"
}
}
// ...
}
в вашем проекте файл build.gradle, чтобы знать, где эта ошибка возникает.
например, когда вы вызываете функцию, которая возвращает Generic Collections, и вы сами не указываете общие параметры.
для функции
List<String> getNames()
List names = obj.getNames();
будет генерировать эту ошибку.
Чтобы решить эту проблему, вы просто добавите параметры
List<String> names = obj.getNames();
Предупреждение "непроверенные или опасные операции" было добавлено, когда java добавил Generics, если я правильно помню. Обычно он просит вас более четко описывать типы, так или иначе.
Например. код ArrayList foo = new ArrayList();
вызывает это предупреждение, потому что javac ищет ArrayList<String> foo = new ArrayList<String>();
Я просто хочу добавить один пример такого непроверенного предупреждения, которое я вижу довольно часто. Если вы используете классы, реализующие интерфейс типа 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. Это должно быть отлито для фактического типа, но это неконтролируемый отбор.
Решением будет использование определенного типа в <>
как 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
.
Вы можете сохранить его в общей форме и записать как:
// list 2 is made generic and can store any type of Object
ArrayList<Object> list2 = new ArrayList<Object>();
Установка типа ArrayList в качестве объекта дает нам преимущество для хранения данных любого типа. Вам не нужно использовать -Xlint или что-либо еще.
У меня было 2 года классов и несколько новых классов. Я решил это в Android Studio следующим образом:
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked"
}
}
}
В моем проекте файл build.gradle(Борж решение)
И потом, если осталось несколько Метедов:
@SuppressWarnings("unchecked")
public void myMethod()
{
//...
}