【问题标题】:How to avoid getting unchecked cast warning when retrieving Serializable object from Bundle从Bundle中检索Serializable对象时如何避免出现未经检查的强制转换警告
【发布时间】:2014-12-27 18:13:54
【问题描述】:

在我的应用程序中,我有一个名为 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)。是否有其他方法可以将可序列化对象保存到包中,然后在不收到此警告的情况下检索它? (当然除了压制它:-))

【问题讨论】:

  • 不,我认为没有任何办法。我知道的唯一方法是让可序列化采用整数的泛型。但是,显然我们不能在这里这样做。因此,如果您知道它不会采取任何其他措施,那么压制战争是最好的方法。据我所知

标签: java android


【解决方案1】:

当您使用 putSerializable(String key, Serializable value) 方法将某些内容存储在 Bundle 中时,您会丢失一些有关所存储数据类型的信息,因为该方法存储任何 Serializable 并且它不关心它是否是 Serializable 的特定实现即HashSet。因为信息丢失了,所以无法在getSerializable中神奇地判断你存储的是什么类型。所以基本上任何避免显式转换引起的警告的尝试都不会阻止实际转换的发生。

【讨论】:

    【解决方案2】:
    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

    【讨论】:

      【解决方案3】:

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

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

      然后像这样读回来:

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

      【讨论】:

        猜你喜欢
        • 2012-03-04
        • 2012-03-18
        • 1970-01-01
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-03
        相关资源
        最近更新 更多