我有一个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>
。