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;
    }
}