2

次のサンプルコードがあります。アプリケーションは初回で正常にインストールされます。ただし、再インストールするとエラーがスローされます。

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        LinkedHashSet<String> planets = new LinkedHashSet<String>();
        planets.add("Earth");
        SharedPreferences prefs = getPreferences(0);
        prefs.edit().putStringSet("planets", planets).commit();
        prefs = getPreferences(0);
        planets = (LinkedHashSet<String>) prefs.getStringSet("planets", new  LinkedHashSet<String>());
    }
}

アプリケーションの再インストール時に発生したエラーを以下に貼り付けました。

Caused by: java.lang.ClassCastException: java.util.HashSet cannot be cast to java.util.LinkedHashSet at com.example.test.MainActivity.onCreate(MainActivity.java:12)

LinkedHashSet保存したを にキャストできない理由を理解したいLinkedHashSetHashSetまた、Android によって自動的に変換されるのはなぜですか?

4

2 に答える 2

8

@Ibungo、あなたは何をするのか誤解していると思いますSharedPreferences。設定にセットを保存するように依頼することはできません。LinkedHashSetジェネラルを保存するように依頼することしかできませんSet。そしてその見返りに、その後将軍を得ることができますSet。あなたと同じセット実装を返すという保証はありません。

設定は、指定した項目のセットを繰り返し処理し、アプリケーションの XML ストアに書き込むだけです。したがって、これらの項目を要求すると、XML から読み取られて新しい Set が作成HashSetされます。これは、最も一般的に使用されるものであるためです。

が必要な唯一の理由はLinkedHashSet、挿入順序を維持したい場合です。この場合、コレクションを ArrayList に変換して保存してみてください。ここに例があります。JSONArrayまたは、データを に保存して、 として保存することもできますString

于 2013-09-13T07:05:41.270 に答える