将 Vector 与 Object 一起使用时如何解决 "Unchecked cast"?

How to resolve "Unchecked cast" when using a Vector with Object?

我收到了一些代码来检查 SMS 数据,并且有一个使用向量转换的过滤器函数,现在导致编译警告:

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 解决方案,例如: this, this, , this, thisthis。 但我必须承认,它们只会造成更多的混乱。

此外,还有一些使用 ArrayList instead of a Vector 的建议,但与 ArrayList 不同,Vectors 具有 synchronized 的优势。我不知道这在这里是否重要。

没有,我不想@SuppressWarnings,而是尝试使用Java 8.

java.util.Vector 根本不应该使用,因为它已经过时了十九年。它带有 non-collections 我们不需要的垃圾。如果需要并发,请使用同步或并发列表。从你的工具箱中删除 Vector(和 Hashtable)。

(Vector<Event>) 和其他泛型转换将始终处于未选中状态,因为泛型类型不可具体化。您需要一个运行时类型令牌,一个 Class<T> 类型的 object,并使用其 cast 方法进行通用转换,但它可能更容易克服您的 "I don't want to @SuppressWarnings" 偏执并正确使用该注释,如 Joshua Bloch 在 Effective Java 中所述。