使用带对象的Vector时如何解决“未经检查的强制转换”?

时间:2017-04-09 14:22:53

标签: java android vector casting compiler-warnings

我已经交了一些代码来检查短信数据,并且有一个使用矢量强制转换的过滤器功能,现在导致编译警告:

Unchecked cast: 'java.lang.Object' to 'java.util.Vector<xxx.Event>'

在这个位置:

values = (Vector<Event>) results.values;
                                ^
required: Vector<Event>
found:    Object

代码段如下:

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            if (results.count != 0) {
                values = (Vector<Event>) results.values;
                notifyDataSetChanged();
            }
        }

        @Override
        protected FilterResults performFiltering(CharSequence smsType) {
            FilterResults results = new FilterResults();
            Vector<Event> eventList = new Vector<>();

            if (smsType.equals("ALL")) {
                results.values = allEvents;
                results.count = allEvents.size();
                return results;
            }
            for (Event event : allEvents) {
                if (event.getType().toString().equals(smsType)) {
                    eventList.add(event);
                }
            }
            results.values = eventList;
            results.count = eventList.size();
            return results;
        }
    };
}

我已经研究过各种SO解决方案,例如: thisthisthisthisthisthis。 但我必须承认,他们只会造成更多混乱。

此外,还有一些使用ArrayList而不是Vector的建议,但与ElementsLists不同,向量具有synchronized的优势。我不知道这在这里是否有任何重要性。

没有,我不想@SuppressWarnings,而是尝试使用Java 8干净地理解和解决问题。

1 个答案:

答案 0 :(得分:0)

java.util.Vector根本不应该使用,因为它已经过时了十九年。它带有我们不需要的非收藏品。如果需要并发,请使用同步或并发列表。从工具箱中驱逐Vector(和Hashtable)。

(Vector<Event>)和其他通用演员表将始终未选中,因为泛型类型不可重复。您需要一个运行时类型标记,类型为Class<T>的对象,并使用其cast方法进行通用转换,但它可能更容易克服您的“我不想{{1正如Joshua Bloch撰写的 Effective Java 中所述,“偏执并正确使用该注释。