我已经交了一些代码来检查短信数据,并且有一个使用矢量强制转换的过滤器功能,现在导致编译警告:
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, this, this和 this。 但我必须承认,他们只会造成更多混乱。
此外,还有一些使用ArrayList而不是Vector的建议,但与ElementsLists不同,向量具有synchronized
的优势。我不知道这在这里是否有任何重要性。
没有,我不想@SuppressWarnings
,而是尝试使用Java 8干净地理解和解决问题。
答案 0 :(得分:0)
java.util.Vector
根本不应该使用,因为它已经过时了十九年。它带有我们不需要的非收藏品。如果需要并发,请使用同步或并发列表。从工具箱中驱逐Vector
(和Hashtable
)。
(Vector<Event>)
和其他通用演员表将始终未选中,因为泛型类型不可重复。您需要一个运行时类型标记,类型为Class<T>
的对象,并使用其cast
方法进行通用转换,但它可能更容易克服您的“我不想{{1正如Joshua Bloch撰写的 Effective Java 中所述,“偏执并正确使用该注释。