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