其他分享
首页 > 其他分享> > android-SharedPreferences-CastException:HashSet无法强制转换为TreeSet

android-SharedPreferences-CastException:HashSet无法强制转换为TreeSet

作者:互联网

我正在尝试使用以下代码将TreeSet存储在SharedPreferences中:

        Set<String> chemicalValuesSet = new TreeSet<>();
        chemicalValuesSet.add("id: " + checkForNull(jsonChemicalValues.getString("id")));
        editor.putStringSet(SP_CHEMICAL_VALUES, chemicalValuesSet);
        editor.apply();

但是,当我尝试访问该TreeSet时,出现铸造错误,就好像该集合被声明为HashSet一样.

    SharedPreferences sharedPreferences =
            getSharedPreferences(SHARED_PREFERENCES, Context.MODE_PRIVATE);
    TreeSet<String> chemicalValues =
            (TreeSet<String>) sharedPreferences.getStringSet(SP_CHEMICAL_VALUES, null);

我不知道要解决这个问题.另外,当我开始编写此部分时,我将chemicalValuesSet设置为HashSet并没有任何问题地进行检索,之后,我决定使用TreeSets.这就是为什么我尝试清理并重新启动项目的原因,但是仍然存在相同的问题.

但是,如果我只是将类型更改为HashSet
在我检索此集合的部分中,它可以正常工作而不会抱怨.

解决方法:

您只是对SharedPreferences及其编辑器的工作方式做出了错误的假设. API永远不会保证调用getStringSet()时获得的Set与调用putStringSet()时存储的Set相同或什至是相同的实现.它只说明您可以通过Set,而您可以获取Set.

如果API文档说它返回一个Set,则不应假定它正在返回TreeSet或HashSet.只是它返回一个Set.如果您绝对需要TreeSet,则创建一个TreeSet并将其从返回的Set中复制到TreeSet中.

标签:classcastexception,sharedpreferences,android
来源: https://codeday.me/bug/20191119/2039947.html