首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >类型安全:从对象到List<MyObject>的未经检查的强制转换

类型安全:从对象到List<MyObject>的未经检查的强制转换
EN

Stack Overflow用户
提问于 2013-02-01 17:16:12
回答 2查看 51.7K关注 0票数 24

我有一个列出自定义对象(假设是MyObject)的ListView。

我想通过一个EditText动态过滤它,所以我必须用一个publishResults方法实现一个getFilter()

代码语言:javascript
复制
@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,因为它只是隐藏了问题,而不是解决方案……

我尝试添加:

代码语言:javascript
复制
if(results.values instanceof List<MyObject>)

但是Eclipse再次抱怨,这解决不了任何问题...

Cannot perform instanceof check against parameterized type List<MyObject>. Use the form List<?>

我知道类型转换总是正确的,但是哪种方法才是确保results.values实际上是List<MyObject>的正确方法呢?

提前感谢!

EN

回答 2

Stack Overflow用户

发布于 2013-02-01 18:34:14

尝试如下所示:

代码语言:javascript
复制
List<?> result = (List<?>) results.values;
for (Object object : result) {
    if (object instanceof MyObject) {
        tempList.add((MyObject) object); // <-- add to temp
    }
}

filteredItems = tempList; // <-- set filtered
票数 15
EN

Stack Overflow用户

发布于 2013-02-01 17:37:07

您可以在将其传递给setItems()之前执行检查。

代码语言:javascript
复制
final Object myListObj = reuslts.values;
if(myListObj instanceof List<?>) {
    if(((List<?>)myListObj).get(0) instanceof MyObject)
        // You can safely suppress the warning here because you made sure it is a List containing MyObject
        MyObjectAdapter.this.setItems((List<? extends MyObject>) myListObj);

}

但是,您需要相应地更改您的setItems()方法:

代码语言:javascript
复制
public void setItems(List<? extends MyObject> list) {
    // Your code here
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14642985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档