我有一个ListView列出了一个自定义对象(比方说MyObject)。

我想通过EditText动态过滤它,所以我不得不使用publishResults方法实现getFilter():

@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
    MyObjectAdapter.this.setItems((List<MyObject>) results.values);
    MyObjectAdapter.this.notifyDataSetChanged();
}

在这一点上,Eclipse提示:Type safety: Unchecked cast from Object to List<MyObject>
我确定这个强制转换将永远是正确的,但是Eclipse仅建议添加@SuppressWarnings("unchecked"),但我完全反对SuppressWarnings,因为它只是隐藏问题,而不是解决方案...

我尝试添加:
if(results.values instanceof List<MyObject>)

但是Eclipse再次提示,这解决不了任何事情...
Cannot perform instanceof check against parameterized type List<MyObject>. Use the form List<?>
我知道强制转换永远是正确的,但这是使代码确保results.values实际上是List<MyObject>的正确方法吗?

提前致谢!

最佳答案

如果您需要做的只是一个Object,那么您将无法在运行时检查您是否确实拥有List<MyObject>,因为通用类型MyObject仅用于编译时类型检查,因此在运行时不可用。这就是为什么在尝试添加instanceof检查时出现错误的原因。

如果您确定自己的Object确实始终是List<MyObject>,那么如果您记录了为什么确定这不是问题,那么我想说@SuppressWarnings可以。

但是,如果您绝对希望避免出现警告,则可以创建自己的List实现(例如MyObjectList),该实现本身不是通用的,但是实现了List<MyObject>。然后,您可以在运行时针对instanceof进行MyObjectList检查。

另一种选择是按照List<?>错误的建议检查并转换为instanceof。然后,您可以遍历列表中的元素,并检查它们是否实际上是MyObject的所有实例,然后将它们复制到新的List<MyObject>

09-26 21:21
查看更多