【问题标题】:Unchecked cast prblem [duplicate]未经检查的演员表问题[重复]
【发布时间】:2017-04-22 02:17:29
【问题描述】:

我有一个自动完成适配器,但我收到以下警告: 未经检查的演员表:'java.lang.Object' 到 'java.util.ArrayList'

这是我的过滤器代码:

private final Filter nameFilter = new Filter() {
    @Override
    public CharSequence convertResultToString(Object resultValue) {
        return ((UserNameAndPic) resultValue).getUserName();
    }

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        if (constraint != null) {
            suggestions.clear();
            for (UserNameAndPic people : tempItems) {
                if (people.getUserName().toLowerCase().contains(constraint.toString().toLowerCase())) {
                    suggestions.add(people);
                }
            }
            FilterResults filterResults = new FilterResults();
            filterResults.values = suggestions;
            filterResults.count = suggestions.size();
            return filterResults;
        } else {
            return new FilterResults();
        }
    }

    @Override
    protected void publishResults(CharSequence constraint, Filter.FilterResults results) {
        List<UserNameAndPic> filterList = (List<UserNameAndPic>) results.values;
        if (results.count > 0) {
            clear();
            for (UserNameAndPic people : filterList) {
                add(people);
                notifyDataSetChanged();
            }
        }
    }
};

线路有问题:

List<UserNameAndPic> filterList = (ArrayList<UserNameAndPic>) results.values;

我知道它只是一个警告,我可以抑制它,但我想避免强制转换而不是抑制警告。 有人知道该怎么做吗?

【问题讨论】:

  • 这不是错误,而是警告。它不会阻止您编译源代码。
  • 应该是Filter.FilterResults&lt;UserNameAndPic&gt; results 然后不需要演员表。但是我不知道具体的FilterResults。
  • 也可能存在 addAll 替换 for 循环。但这只是美化代码。
  • 我编辑了我的问题并添加了完整的过滤器适配器。你能帮我弄清楚该怎么做吗?

标签: java android unchecked-cast


【解决方案1】:

编译器不知道你正在做的转换是否正确和安全。

如果您无法避免强制转换(最佳做法是避免强制转换,但您没有发布足够的代码来提供帮助),那么您可以取消警告,如下所示:

@SuppressWarnings("unchecked")

您可以在方法级别执行此操作,甚至可以对变量本身执行此操作:

@SuppressWarnings("unchecked")
String v = (String) vToCast;

我相信这个问题已经被回答了数百万次了......

【讨论】:

  • 这可以按照 Magd Kudama 的回答来完成,但这并不是真正的最佳实践。使用这个怎么样?:String v = String.valueOf(vToCast); 在您的情况下,甚至建议检查 results.cast() 方法是否可用于将结果转换为所需对象。
  • @Nico 正如我所说,最好的做法是让results.values 返回一个List&lt;UserNameAndPic&gt;,因此完全避免任何转换。
  • 对不起,我从你的陈述中忽略了这一点。的确,最好避免强制转换,但我认为由于这是一个已实现的 Java 对象,因此他似乎将其应用于他的自定义对象,可用于 FilterResult 的函数 cast() 是执行安全强制转换的选项。再次抱歉
  • 我已经编辑了我的问题并添加了完整的过滤器适配器。你能帮我弄清楚要改变什么,这样我就可以避免强制转换了吗?
  • 问题在这里得到解答:stackoverflow.com/questions/14642985/…
猜你喜欢
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
相关资源
最近更新 更多