Android SharedReferences-CastException:无法将哈希集强制转换为TreeSet

Android SharedReferences-CastException:无法将哈希集强制转换为TreeSet,android,sharedpreferences,classcastexception,Android,Sharedpreferences,Classcastexception,我正在尝试使用以下代码将TreeSet存储在SharedReferences中: Set<String> chemicalValuesSet = new TreeSet<>(); chemicalValuesSet.add("id: " + checkForNull(jsonChemicalValues.getString("id"))); editor.putStringSet(SP_CHEMICAL_VALUES, ch

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

        Set<String> chemicalValuesSet = new TreeSet<>();
        chemicalValuesSet.add("id: " + checkForNull(jsonChemicalValues.getString("id")));
        editor.putStringSet(SP_CHEMICAL_VALUES, chemicalValuesSet);
        editor.apply();
我没有解决这个问题的线索。此外,当我开始编写本部分时,我将chemicalValuesSet设置为
HashSet
并进行检索,没有任何问题,后来我决定使用
TreeSet
s。这就是为什么我尝试清理并重新启动项目,但仍然存在相同的问题

但是,如果我简单地将类型更改为
HashSet

在我检索这个集合的部分中,它毫无怨言地工作

不能立即将HashSet强制转换为TreeSet。 相反,您可以执行以下任一操作将哈希集中的所有项添加到TreeSet中,但请记住,添加到TreeSet的项将自动排序

// Passing the collection HashSet to TreeSet
HashSet<String> hashSet = sharedPreferences.getStringSet(SP_CHEMICAL_VALUES, null);
TreeSet<String> chemicalValues = new TreeSet<String>(hashSet);
//将集合哈希集传递给TreeSet
HashSet HashSet=SharedReferences.getStringSet(SP\u值,null);
树集化学值=新树集(哈希集);

//使用addAll()API将哈希集的所有值添加到TreeSet
//这将有助于保留TreeSet的值(如果有)
TreeSet chemicalValues=新的TreeSet();
...
HashSet HashSet=SharedReferences.getStringSet(SP\u值,null);
chemicalValues.addAll(hashSet);

您只是对SharedReferences及其编辑器的工作方式做出了错误的假设。API从不保证调用
getStringSet()
时得到的集与调用
putStringSet()
时存储的集相同,甚至是相同的实现。它所说的是,你可以通过一套,你可以得到一套


如果API文档说它返回一个集合,那么您不应该假设它返回的是一个树集或哈希集。只是它正在返回一组。如果您确实需要一个树集,那么创建一个树集并将项目从返回集复制到树集。

实际上,返回集是一个哈希集:

 TreeSet<String> chemicalValues =
        (TreeSet<String>) sharedPreferences.getStringSet(SP_CHEMICAL_VALUES, null);
HashSet和TreeSet不能相互解释。
希望这能对你有所帮助。

,java.util.Set)“Return”解释说,如果key不是Set,它会抛出类强制转换异常。好吧,但它是Set。卸载应用程序,然后重新安装并检查。我也尝试过。它与我问的问题无关,但问题是因为强制转换。方法SharedReferences.getStringSet(…)返回Set,您试图将其强制转换为TreeSet,这就是导致ClassCastException的原因。您是如何得出它返回HashSet的结论的?
// Adding all the values of the HashSet to TreeSet using addAll() API
// This will help to retain the values of TreeSet (if any)
TreeSet<String> chemicalValues = new TreeSet<String>();
...
HashSet<String> hashSet = sharedPreferences.getStringSet(SP_CHEMICAL_VALUES, null);
chemicalValues.addAll(hashSet);
 TreeSet<String> chemicalValues =
        (TreeSet<String>) sharedPreferences.getStringSet(SP_CHEMICAL_VALUES, null);
public Set<String> getStringSet(String key, Set<String> defValues) {
    synchronized (this) {
        awaitLoadedLocked();
        Set<String> v = (Set<String>) mMap.get(key);
        return v != null ? v : defValues;
    }
}
    chemicalValues.getClass().getSimpleName()