从Bundle中检索Serializable对象时,如何避免获取未经检查的强制转换警告

时间:2014-12-27 18:13:54

标签: java android

在我的应用程序中,我有一个活动,其成员变量名为mSelectedContacts,类型为HashSet<Integer>,这是活动状态的一部分,因此我将其保存在onSaveInstanceState()中,就像这样

public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putSerializable(STATE_SELECTED_CONTACTS, mSelectedContacts);
    super.onSaveInstanceState(savedInstanceState);
}

当重新创建活动时,我会像这样获得存储的Hashset。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null &&
            savedInstanceState.containsKey(STATE_SELECTED_CONTACTS)) {
        mSelectedContacts = (HashSet<Integer>)
                savedInstanceState.getSerializable(STATE_SELECTED_CONTACTS);
    } else
        mSelectedContacts = new HashSet<Integer>();
    ...

现在这样可以正常工作,但它会生成一个未经检查的强制转换警告(从java.io.serializable到java.lang.Integer)。是否有其他方法将可序列化对象保存到一个包中,然后检索它而不会收到此警告? (除了当然压制它: - ))

3 个答案:

答案 0 :(得分:1)

当您使用putSerializable(String key, Serializable value)方法在Bundle中存储某些内容时,您会丢失有关所存储数据类型的一些信息,因为该方法会存储任何Serializable并且它并不关心它是否&# 39; Serializable的特定实现,即HashSet。由于信息丢失,因此无法在getSerializable中神奇地确定您存储的类型。因此,基本上任何避免显式施法引起的警告的尝试都不会阻止实际施法。

答案 1 :(得分:0)

您可以尝试使用Integer ArrayList和中间件:

savedInstanceState.putIntegerArrayList(STATE_SELECTED_CONTACTS, new ArrayList<Integer>(mSelectedContacts));

然后像这样读回来:

mSelectedContacts = new HashSet<Integer>(savedInstanceState.getIntegerArrayList(STATE_SELECTED_CONTACTS));

答案 2 :(得分:0)

if (savedInstanceState != null &&
        savedInstanceState.containsKey(STATE_SELECTED_CONTACTS)) {
    mSelectedContacts = Sets.newHashSet(savedInstanceState.getIntegerArrayList(STATE_SELECTED_CONTACTS);
} else
    mSelectedContacts = new HashSet<Integer>();

@Override protected void onSaveInstanceState(Bundle outState) {
  super.onSaveInstanceState(outState);
  outState.putIntegerArrayList(STATE_SELECTED_CONTACTS, Lists.newArrayList(mSelectedContacts);
}

但它有点多余,我建议在这种情况下忽略此警告。 因为您知道序列化字段类型是HashSet