Нет (простого) способа написания кода, чтобы вы не получили это предупреждение.Это некритично, вы, вероятно, можете игнорировать это.
Почему это происходит?
Обобщения являются плодом воображения компилятора.ваш сериализованный поток байтов хранит только то, что вы сохранили объект HashSet
, он не хранит часть <Integer>
и не может, потому что эта информация больше не присутствует во время выполнения.
Когда высохраните объект, который вы загружаете обратно из вашего сериализованного потока, в переменную number
, java не знает, содержит ли хэш-набор только Integer
экземпляров, и во время выполнения это не проверяется.Например, если он содержит строки, так и будет, и позже вы получите ClassCastException
, если это так.
Предупреждение конкретно означает: «Хорошо, вы утверждаете, что этот HashSet вы только что получилииз системы сериализации содержит только целые числа. У javac нет способа проверки во время компиляции, и это приведение не будет генерировать код времени выполнения, чтобы сделать это. Поэтому мы просто скажем так, так что будем надеяться, чтоВы правы! Если нет, ClassCastExceptions возникнет позже в странных местах. "
Как мне избежать этого?
Один из способов - сначала назначить переменную типа HashSet<?>
,затем зациклите его, проверьте для каждого значения, является ли оно целым числом, если да, поместите его в number
, если нет, выйдите из метода с соответствующим сообщением об ошибке.Приведение отдельных членов набора возможно и не выдает предупреждение ... но теперь вы тратите дополнительный цикл.
Еще лучшее решение - не использовать встроенный механизм сериализации в Java.Это сложно, имеет тенденцию поддаваться проблемам безопасности, трудно справляться с растущими потребностями (трудно менять версии или загружать / записывать их с других языков), оно не читается человеком и не занимает мало места.
Попробуйте, например, Джексон , чтобы сериализовать ваши объекты.