Корень проблемы здесь в том, что вы пытаетесь набрать приведение к универсальному типу. Это не может быть сделано без небезопасного / непроверенного приведения типа.
Типы выполнения универсальных типов являются необработанными типами; то есть типы, в которых фактические типы параметров типа неизвестны. В этом случае тип времени выполнения будет LinkedHashMap<?, ?>
. Это не может быть безопасно приведено к типу LinkedMashMap<String, String>
, поскольку во время выполнения система не может знать, что все ключи и значения на самом деле являются String
экземплярами.
У вас есть два варианта:
Вы можете добавить аннотацию, чтобы сказать компилятору «заткнуться» о непроверенном приведении. Это немного рискованно. Если по какой-либо причине один из ключей или значений на самом деле не является строкой, ваше приложение может позже получить ClassCastException
в совершенно неожиданном месте; например во время итерации клавиш или присвоения результата get
.
Вы можете вручную скопировать десериализованный Map<?, ?>
в новый LinkedMashMap<String, String>
, явно приведя каждый ключ и значение к String
.
UPDATE
Очевидно, что истинная причина исключения времени выполнения (в отличие от ошибки компиляции «unsafe typecast») заключается в том, что Android передает serializedExtra
между намерениями как обычный HashMap
, а не использует класс Map
, который вы предоставлена. Это описано здесь:
Как объясняют эти вопросы и ответы, простого обходного пути нет. Если вы хотите передать карту, сохраняющую порядок ключей, придется преобразовать карту в массив пар и передать ее. С другой стороны, вам нужно будет восстановить карту из переданного массива.