Таким образом, я хочу передать LinkedHashMap намерению.
//SEND THE MAP
Intent singlechannel = new Intent(getBaseContext(),singlechannel.class);
singlechannel.putExtra("db",shows1);//perase to
startActivity(singlechannel);
//GET THE MAP
LinkedHashMap db = new LinkedHashMap();
db=(LinkedHashMap) getIntent().getSerializableExtra("db");
Этот Работал Как очарование с HashMap. Но с LinkedHashMap я получил проблему, я получил ошибку периода выполнения здесь
db=(LinkedHashMap) getIntent().getSerializableExtra("db");
Я не получаю ошибки с HashMap.
Я также получил предупреждение "Безопасность с точки зрения типов: Неконтролируемый бросок от сериализуемого до LinkedHashMap", Но у меня было это предупреждение с HashMap также. Любые идеи. Любая справка очень ценится
Также я просто видел это. https://issues.apache.org/jira/browse/HARMONY-6498
Корень проблемы здесь в том, что вы пытаетесь ввести приведение к универсальному типу. Это невозможно сделать без приведения типа unsafe / unchecked.
Типы времени выполнения универсальных типов - это необработанные типы; то есть типы, в которых фактические типы параметров типа неизвестны. В этом случае тип среды выполнения будет LinkedHashMap ,?>
. Это невозможно безопасно привести к типу LinkedMashMap
, потому что система времени выполнения не имеет возможности узнать, что все ключи и значения на самом деле являются экземплярами String
.
У вас есть два варианта:
Вы можете добавить аннотацию, чтобы сообщить компилятору, чтобы он «заткнулся» по поводу непроверенного приведения. Это немного рискованно.Если по какой-то причине один из ключей или значений на самом деле не является строкой, ваше приложение может позже получить исключение ClassCastException
в совершенно неожиданном месте; например при повторении ключей или присвоении результата get
.
Вы можете вручную скопировать десериализованную карту ,?>
в новую LinkedMashMap
, явно преобразовав каждый ключ и значение в String
].
ОБНОВЛЕНИЕ
По-видимому, настоящая причина исключения времени выполнения (в отличие от ошибки компиляции «небезопасное приведение типов») заключается в том, что Android передает serializedExtra
между намерениями как обычную HashMap
вместо использования предоставленного вами класса Map
. Это описано здесь:
Как объясняется в этих вопросах и ответах, простого обходного пути не существует. Если вы хотите передать карту, сохраняя порядок ключей, вам придется преобразовать карту в массив пар и передать это. С другой стороны, вам нужно будет восстановить карту из переданного массива.
LinkedHashMap действительно реализует интерфейс карты, вот определение из исходного кода:
public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V>
Следующий тест работает нормально, поэтому я думаю, что ваша проблема не связана с LinkedHashMap.
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("1", "one");
FileOutputStream fos = new FileOutputStream("c://map.ser");
ObjectOutputStream out = new ObjectOutputStream(fos);
out.writeObject(map);
out.close();
FileInputStream fin = new FileInputStream("c://map.ser");
ObjectInputStream in = new ObjectInputStream(fin);
Map<String, String> map2 = (Map<String, String>) in.readObject();
System.out.println(map2);