Java 无法将Android哈希集强制转换为LinkedHashSet
我有以下示例代码。第一次成功安装应用程序。 但是,它在重新安装时抛出一个错误Java 无法将Android哈希集强制转换为LinkedHashSet,java,android,sharedpreferences,hashset,linkedhashset,Java,Android,Sharedpreferences,Hashset,Linkedhashset,我有以下示例代码。第一次成功安装应用程序。 但是,它在重新安装时抛出一个错误 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
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>());
}
}
我想了解为什么保存的
LinkedHashSet
不能被转换回LinkedHashSet
。为什么Android会自动将其转换为HashSet
HashSet<String> planets = new LinkedHashSet<String>();
planets.add("Earth");
SharedPreferences prefs = getPreferences(0);
prefs.edit().putStringSet("planets", planets).commit();
prefs = getPreferences(0);
planets = prefs.getStringSet("planets", new LinkedHashSet<String>());
@Ibungo,我想你误解了
SharedReferences
的作用。
您不能要求Pref保存LinkedHashSet
集-您只能要求它保存常规集
。作为回报,您可以在此之后获得一个常规集。无法保证它将返回与您相同的set实现
首选项只是迭代您提供给它们的项集,并将它们写入应用程序的XML存储。因此,当您请求这些项目时,它正在从XML中读取并创建一个新的集合-HashSet
,因为它是最常用的集合
我能想到,您可能需要一个LinkedHashSet
的唯一原因是,如果您想保留插入顺序。如果是这种情况,您可以尝试将集合转换为ArrayList并存储它-下面是一个示例。或者,您可以将数据保存到JSONArray
并将其存储为String
Hi@flx,我想知道为什么我不能使用LinkedHashSet。因为SharedReferences.getStringSet()
返回的是HashSet
,而不是LinkedHashSet
。就这么简单,但为什么?我要求它保存一个LinkedHashSet
,为什么它会返回我HashSet
?你没有。您要求它保存一个HashSet
:,java.util.Set)//您不能用简单的想象更改API方法的签名。您好@flx,根据Android API,我们可以传递实现Set
接口的任何类的对象。HashSet
和LinkedHashSet
都实现了Set
接口,根据OP的代码,他要求API保存一个LinkedHashSet
。那么,当他试图取回同一个对象时,为什么它会自动转换为HashSet
?充分披露:我是OP的同事。
HashSet<String> planets = new LinkedHashSet<String>();
planets.add("Earth");
SharedPreferences prefs = getPreferences(0);
prefs.edit().putStringSet("planets", planets).commit();
prefs = getPreferences(0);
planets = prefs.getStringSet("planets", new LinkedHashSet<String>());
public Editor putStringSet(String key, Set<String> values) {
synchronized (this) {
mModified.put(key,
(values == null) ? null : new HashSet<String>(values));
return this;
}
}