Я создаю некоторые классы динамически с помощью, sun.misc.Unsafeи это дает эти подсказки на выходе
Давут Гюрбуз
Ответы:
392
Это происходит в Java 5 и более поздних версиях, если вы используете коллекции без спецификаторов типов (например, Arraylist()вместо ArrayList<String>()). Это означает, что компилятор не может проверить, что вы используете коллекцию безопасным для типов способом, используя дженерики. .
Чтобы избавиться от предупреждения, просто уточните, какой тип объектов вы храните в коллекции. Итак, вместо
List myList =newArrayList();
использование
List<String> myList =newArrayList<String>();
В Java 7 вы можете сократить общее создание экземпляров, используя вывод типа .
В Java 7 я получил то же предупреждение, даже используя Type Interference с этой коллекцией:ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
Lucio
13
@Lucio Вам все еще нужны угловые скобки. new ConcurrentHashMap<>()
Билл Ящерица
3
Просто для того, чтобы подчеркнуть, что это не конкретные коллекции. Вы получаете ошибку, потому что компилятор Java не может обеспечить безопасность типов в целом. Например, такое же предупреждение выдается с помощью следующего кода: AbstractMap.SimpleEntry <String, String> entry = new AbstractMap.SimpleEntry ("hello", "world");
Если вы сделаете то, что он предлагает, и перекомпилируете с ключом "-Xlint: unchecked", он даст вам более подробную информацию.
Помимо использования необработанных типов (как описано в других ответах), неконтролируемое приведение также может вызывать предупреждение.
После того как вы скомпилировали с -Xlint, вы сможете переработать свой код, чтобы избежать предупреждения. Это не всегда возможно, особенно если вы интегрируете с устаревшим кодом, который нельзя изменить. В этой ситуации вы можете решить отключить предупреждение в тех местах, где вы знаете, что код правильный:
Я хотел бы, чтобы больше людей поддержали этот ответ. Я поддерживаю свой выбор ответа @Bill the Lizard, но этот ответ мне близок, потому что он показал мне, что ответ смотрел мне прямо в лицо в самом предупреждении, а также объяснил другую причину возникновения ошибки.
toolbear
1
Это окончательный ответ!
russellhoff
Этот ответ должен быть помечен как решение! Спасибо!
спасибо, я нашел, откуда приходит мое предупреждение, добавив это
JackOuttaBox
Я получаю это предупреждение, и КАК показывает класс, где он произвел. И это не ошибка, просто предупреждение. Почему мы должны добавить эту опцию? Разве проблемный класс не показывался в вашей ситуации?
CoolMind
Лол, я просто отвечаю на вопрос, и нет , проблема не отображается, пока ты не добавишь это.
Борж
16
Это предупреждение означает, что ваш код работает с необработанным типом, перекомпилируйте пример с
Предупреждение о «непроверенных или небезопасных операциях» было добавлено, когда Java добавил Generics , если я правильно помню. Обычно он просит вас быть более ясным о типах, так или иначе.
Например. код ArrayList foo = new ArrayList();вызывает это предупреждение, потому что Javac ищетArrayList<String> foo = new ArrayList<String>();
Я просто хочу добавить один пример неконтролируемого предупреждения, которое я вижу довольно часто. Если вы используете классы, которые реализуют интерфейс, такой как Serializable, часто вы будете вызывать методы, которые возвращают объекты интерфейса, а не фактический класс. Если возвращаемый класс должен быть приведен к типу, основанному на обобщениях, вы можете получить это предупреждение.
Вот краткий (и несколько глупый) пример для демонстрации:
import java.io.Serializable;publicclassSimpleGenericClass<T>implementsSerializable{publicSerializable getInstance(){returnthis;}// @SuppressWarnings("unchecked")publicstaticvoid main(){SimpleGenericClass<String> original =newSimpleGenericClass<String>();// java: unchecked cast// required: SimpleGenericClass<java.lang.String>// found: java.io.SerializableSimpleGenericClass<String> returned =(SimpleGenericClass<String>) original.getInstance();}}
getInstance () возвращает объект, который реализует Serializable. Это должно быть приведено к фактическому типу, но это непроверенное приведение.
У меня есть ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;. Поскольку valueэто сложная структура (я хочу очистить JSON ), могут быть любые комбинации чисел, логических значений, строк, массивов. Итак, я использовал решение @Dan Dyer:
sun.misc.Unsafe
и это дает эти подсказки на выходеОтветы:
Это происходит в Java 5 и более поздних версиях, если вы используете коллекции без спецификаторов типов (например,
Arraylist()
вместоArrayList<String>()
). Это означает, что компилятор не может проверить, что вы используете коллекцию безопасным для типов способом, используя дженерики. .Чтобы избавиться от предупреждения, просто уточните, какой тип объектов вы храните в коллекции. Итак, вместо
использование
В Java 7 вы можете сократить общее создание экземпляров, используя вывод типа .
источник
ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
new ConcurrentHashMap<>()
-Xlint:unchecked
с MAVENЕсли вы сделаете то, что он предлагает, и перекомпилируете с ключом "-Xlint: unchecked", он даст вам более подробную информацию.
Помимо использования необработанных типов (как описано в других ответах), неконтролируемое приведение также может вызывать предупреждение.
После того как вы скомпилировали с -Xlint, вы сможете переработать свой код, чтобы избежать предупреждения. Это не всегда возможно, особенно если вы интегрируете с устаревшим кодом, который нельзя изменить. В этой ситуации вы можете решить отключить предупреждение в тех местах, где вы знаете, что код правильный:
источник
Для Android Studio необходимо добавить:
в файле build.gradle вашего проекта, чтобы узнать, где возникает эта ошибка.
источник
Это предупреждение означает, что ваш код работает с необработанным типом, перекомпилируйте пример с
чтобы получить детали
как это:
docs.oracle.com рассказывает об этом здесь: http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html
источник
У меня было 2 года классов и несколько новых классов. Я решил это в Android Studio следующим образом:
В моем проекте файл build.gradle ( решение Борж )
И потом, если осталось несколько Метедов:
источник
например, когда вы вызываете функцию, которая возвращает общие коллекции, и вы не указываете общие параметры самостоятельно.
для функции
сгенерирует эту ошибку.
Для ее решения достаточно добавить параметры
источник
Предупреждение о «непроверенных или небезопасных операциях» было добавлено, когда Java добавил Generics , если я правильно помню. Обычно он просит вас быть более ясным о типах, так или иначе.
Например. код
ArrayList foo = new ArrayList();
вызывает это предупреждение, потому что Javac ищетArrayList<String> foo = new ArrayList<String>();
источник
Я просто хочу добавить один пример неконтролируемого предупреждения, которое я вижу довольно часто. Если вы используете классы, которые реализуют интерфейс, такой как Serializable, часто вы будете вызывать методы, которые возвращают объекты интерфейса, а не фактический класс. Если возвращаемый класс должен быть приведен к типу, основанному на обобщениях, вы можете получить это предупреждение.
Вот краткий (и несколько глупый) пример для демонстрации:
getInstance () возвращает объект, который реализует Serializable. Это должно быть приведено к фактическому типу, но это непроверенное приведение.
источник
Решением будет использование определенного типа в
<>
лайкеArrayList<File>
.пример:
Приведенный выше код генерирует предупреждение, потому что
ArrayList
не имеет определенного типа.код выше подойдет. Только изменение в третьей строке после
ArrayList
.источник
Вы можете сохранить его в общей форме и записать как:
Установка типа ArrayList в качестве объекта дает нам преимущество для хранения любого типа данных. Вам не нужно использовать -Xlint или что-то еще.
источник
Это предупреждение также может быть вызвано из-за
new HashMap () или новый ArrayList (), который является универсальным типом, должен быть конкретным, иначе компилятор выдаст предупреждение.
Пожалуйста, убедитесь, что если ваш код содержит следующее, вы должны изменить соответствующим образом
новый HashMap () => карта карта = новый HashMap () новый HashMap () => карта карта = новый HashMap <> ()
new ArrayList () => Список карт = новый ArrayList () Новый ArrayList () => Список карт = новый ArrayList <> ()
источник
У меня есть
ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;
. Посколькуvalue
это сложная структура (я хочу очистить JSON ), могут быть любые комбинации чисел, логических значений, строк, массивов. Итак, я использовал решение @Dan Dyer:источник