Наприклад:
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>()
). Це означає, що компілятор не може перевірити, що ви використовуєте колекцію безпечним для типу способом, використовуючи дженерики .
Щоб позбутися попередження, просто уточнюйте, який тип об’єктів ви зберігаєте в колекції. Отже, замість
List myList = new ArrayList();
використання
List<String> myList = new ArrayList<String>();
У Java 7 ви можете скоротити загальну інстанцію за допомогою Type Inference .
List<String> myList = new ArrayList<>();
ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
new ConcurrentHashMap<>()
-Xlint:unchecked
з MAVEN
Якщо ви зробите те, що він пропонує, і перекомпілюйте за допомогою перемикача "-Xlint: unconnected", це дасть вам більш детальну інформацію.
Окрім використання сировинних типів (як описано в інших відповідях), неперевірений виступ також може спричинити попередження.
Після компіляції з -Xlint ви маєте можливість переробити свій код, щоб уникнути попередження. Це не завжди можливо, особливо якщо ви інтегруєтесь із застарілим кодом, який неможливо змінити. У цій ситуації ви можете вирішити придушити попередження в місцях, де вам відомо, що код правильний:
@SuppressWarnings("unchecked")
public void myMethod()
{
//...
}
Для Android Studio потрібно додати:
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked"
}
}
// ...
}
у файлі build.gradle вашого проекту, щоб знати, де ця помилка створюється.
Це попередження означає, що ваш код працює в необробленому типі, перекомпілюйте приклад із
-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
У мене були 2-річні класи та деякі нові класи. Я вирішив це в Android Studio так:
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked"
}
}
}
У моєму файлі build.gradle проекту ( рішення Боржа )
І тоді, якщо залишиться кілька метедів:
@SuppressWarnings("unchecked")
public void myMethod()
{
//...
}
Попередження "неперевірені або небезпечні операції" було додано, коли 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 як Object дає нам перевагу для зберігання будь-якого типу даних. Вам не потрібно використовувати -Xlint або щось інше.
Це попередження також може бути порушено через
новий HashMap () або новий ArrayList (), який є загальним типом, повинен бути специфічним, інакше компілятор генерує попередження.
Будь ласка, переконайтесь, що якщо ваш код містить наведене нижче, його потрібно змінити відповідно
новий HashMap () => Карта карти = новий HashMap () новий HashMap () => Карта карти = новий HashMap <> ()
новий ArrayList () => карта списку = новий ArrayList () новий ArrayList () => карта списку = новий ArrayList <> ()
Я маю ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;
. Оскільки value
це складна структура (я хочу очистити JSON ), можуть статися будь-які комбінації на числах, булевих рядках, рядках, масивах. Отже, я використав рішення @Dan Dyer:
@SuppressWarnings("unchecked")
ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;
sun.misc.Unsafe
і даю ці підказки на виході