Android HashSet无法强制转换为LinkedHashSet

Ibu*_*ngo 2 java android hashset linkedhashset sharedpreferences

我有以下示例代码.应用程序第一次安装成功.但是,它会在重新安装时抛出错误.

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>());
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经粘贴了重新安装以下应用程序时产生的错误.

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

我想了解为什么保存LinkedHashSet不能被归还给LinkedHashSet.为什么它会HashSet被Android自动转换为?

Sam*_*ski 6

@Ibungo,我想你误会了SharedPreferences什么.你不能要求prefs保存一LinkedHashSet组 - 你只能要求它保存一般Set.作为回报,你可以Set在那之后得到一位将军.无法保证它将返回与您相同的集合实现.

首选项只是迭代您给出的项目集,并将它们写入应用程序的XML存储区.因此,当您要求这些项目时,它正在读取XML并创建一个新的Set - HashSet因为它是最常用的一个.

LinkedHashSet我能想到的唯一原因是你想要保留插入顺序.如果是这样的话,你可以尝试转换您的收藏ArrayList和存储它-有一个例子在这里.或者,您可以将数据保存到a JSONArray并将其存储为String.