如何解决在使用带有Object的Vector时出现的"Unchecked cast"问题?

7 浏览
0 Comments

如何解决在使用带有Object的Vector时出现的"Unchecked cast"问题?

我被交付了一些代码来检查短信数据,其中有一个使用向量转换的过滤函数,现在导致编译警告:

未经检查的转换:'java.lang.Object' 到 'java.util.Vector'

在此位置:

values = (Vector) results.values;
                                ^
所需类型:Vector
找到类型:Object

代码片段如下:

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            if (results.count != 0) {
                values = (Vector) results.values;
                notifyDataSetChanged();
            }
        }
        @Override
        protected FilterResults performFiltering(CharSequence smsType) {
            FilterResults results = new FilterResults();
            Vector 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解决方案,例如:

这个,

这个,

这个,

这个,

这个

这个

但我必须承认它们只会导致更多的困惑。

此外,有一些建议使用ArrayList而不是Vector,但Vector有一个优点,就是与ArrayList不同,它是同步的。我不知道这在这里是否重要。

而且,,我不想使用@SuppressWarnings,而是希望尝试使用Java 8来理解和解决问题。

0
0 Comments

问题的原因是使用了过时的Vector类,并且对其进行了泛型转换,导致出现了"Unchecked cast"警告。解决方法是使用同步或并发列表来替代Vector类,并使用Class对象的cast方法进行泛型转换,或者正确地使用注解来解决该问题。

Java中的Vector类自19年前就已经过时,不应再使用。它包含了我们不需要的非集合内容。如果需要并发性,请使用一个同步或并发列表来替代Vector类(和Hashtable类),将它们从工具箱中淘汰。

对于(Vector)和其他泛型转换,由于泛型类型不是可反射的,因此始终会出现"Unchecked cast"警告。解决方法是使用运行时类型标记,即一个类型为Class的对象,并使用它的cast方法进行泛型转换。但更简单的方法可能是克服对"我不想使用"的偏见,正确地使用注解来解决这个问题,如Joshua Bloch在《Effective Java》中所述。

0