5

だから私はLinkedHashMapをインテントに渡したいのです。

//SEND THE MAP
Intent singlechannel = new Intent(getBaseContext(),singlechannel.class);
singlechannel.putExtra("db",shows1);//perase to
startActivity(singlechannel);

//GET THE MAP
LinkedHashMap<String,String> db = new LinkedHashMap<String,String>();   
db=(LinkedHashMap<String,String>) getIntent().getSerializableExtra("db");

これはHashMapで魅力のように機能しました。しかし、LinkedHashMapを使用すると、問題が発生しました。ここでランタイムエラーが発生しました。

  db=(LinkedHashMap<String,String>) getIntent().getSerializableExtra("db");

HashMapでエラーは発生しません。

「タイプセーフティ:SerializableからLinkedHashMapへのチェックされていないキャスト」という警告も表示されましたが、HashMapでもこの警告が表示されました。任意のアイデア。任意の助けは大歓迎です

また、私はこれを見たばかりです。 https://issues.apache.org/jira/browse/HARMONY-6498

4

2 に答える 2

4

ここでの問題の根本は、ジェネリック型に型キャストしようとしていることです。これは、安全でない/チェックされていない型キャストなしでは実行できません。

ジェネリック型のランタイム型はraw型です。つまり、タイプパラメータの実際のタイプが不明なタイプ。この場合、ランタイムタイプはになりますLinkedHashMap<?, ?>LinkedMashMap<String, String>ランタイムシステムには、すべてのキーと値が実際にStringインスタンスであることを知る方法がないため、これを安全に型キャストすることはできません。

2つのオプションがあります。

  • チェックされていないキャストについて「シャットダウン」するようにコンパイラーに指示する注釈を追加できます。これは少し危険です。何らかの理由でキーまたは値の1つが実際には文字列ではない場合、アプリケーション後でClassCastExceptionまったく予期しない場所でを取得する可能性があります。たとえば、キーを繰り返したり、の結果を割り当てたりしますget

  • デシリアライズMap<?, ?>されたものを手動で新しいにコピーし、LinkedMashMap<String, String>各キーと値をに明示的にキャストできますString

アップデート

明らかに、ランタイム例外の本当の原因は(「安全でない型キャスト」コンパイルエラーとは異なり)、Androidが、指定したクラスを使用するのではなくserializedExtra、通常のインテント間を渡していることです。これはここで説明されています:HashMapMap

そのQ&Aで説明されているように、簡単な回避策はありません。キーの順序を保持したマップを渡す場合は、マップをペアの配列に変換して渡す必要があります。もう一方の端では、渡された配列からマップを再構築する必要があります。

于 2010-05-23T02:19:16.687 に答える
2

LinkedHashMapはMapインターフェースを実装しています。ソースコードからの定義は次のとおりです。

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); 
于 2010-05-23T03:05:21.743 に答える