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

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不能被转换回LinkedHashSet。为什么Android会自动转换成HashSet

最佳答案

@伊万戈,我想你误解了我的意思。
您不能要求prefs保存SharedPreferences集合-只能要求它保存常规LinkedHashSet。作为回报,你可以在那之后得到一个普通的Set。不能保证它会返回与您相同的set实现。
这些首选项只是遍历您给它们的一组项,并将它们写入应用程序的xml存储区。因此,当您请求这些项时,它正在读取xml并创建一个新的集合-Set,因为它是最常用的集合。
我可以想到,您可能需要HashSet的唯一原因是您是否希望保留插入顺序。如果是这种情况,您可以尝试将集合转换为arraylist并存储它-有一个示例here。或者,您可以将数据保存到LinkedHashSet并将其存储为JSONArray

关于java - Android HashSet无法强制转换为LinkedHashSet,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18779331/

10-10 22:49