アプリケーションでSharedPreferences
の代わりに Hawk を使用しています。
LinkedHashMap
を格納しようとしていますが、何らかの理由でHawkからプルバックすると、通常どおり返されます。 HashMap
ではなくLinkedHashMap
。この時点で、ClassCastException
をHashMap
に直接キャストできないため、LinkedHashMap
でクラッシュします。
したがって、問題は、返されたHashMap
をLinkedHashMap
に変換するにはどうすればよいかということです。
LinkedHashMap
からHashMap
を作成できることを示唆するすべての回答は技術的には正しいですが、望ましい結果は得られません:
もちろん、LinkedHashMap
からHashMap
を作成することはできますが、LinkedHashMap
が元の順序と同じであるとは限りません。
問題は、LinkedHashMap
が永続ストレージに単純な順序なしのMap
として格納されるときにシリアル化されることです。これは、個々のアイテムの順序を永続化しません。次に、永続ストレージからオブジェクトを抽出すると、オブジェクトはプレーンなHashMap
として返され、「順序付け」(最初にLinkedHashMap
が必要だったもの)が失われます。 )。次に、返されたLinkedHashMap
からHashMap
を作成すると、順序はおそらく元の順序とは異なります。
これを正しく行うには、おそらくLinkedHashMap
をオブジェクトの順序付き配列に変換し、この順序付き配列を永続ストレージに格納する必要があります。次に、オブジェクトの順序付けられた配列を永続ストレージから読み取り、正しい順序でLinkedHashMap
を再作成できます。基本的に、LinkedHashMap
を自分でシリアル化および逆シリアル化する必要があります。
詳細については、---(この質問に対する私の回答 を参照してください。
新しいLinkedHashMapを作成するだけです。これは、コンストラクター引数として任意のMapを使用できるためです。
LinkedHashMap<Object> newMap = new LinkedHashMap<>(theHashMapReturnedFromHawk);
Object
が必要なタイプになります。
LinkedHashMap のコンストラクターの1つは、Map
を受け入れます。 LinkedHashMap
と同じ内容のHashMap
を返します。
コードサンプル:
LinkedHashMap<T> newMap = new LinkedHashMap<T>(hashmap);
ここで、T
は、HashMap
に格納されているオブジェクトのタイプです。