将 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,
this 和
this。
但我必须承认,它们只会造成更多的混乱。
此外,还有一些使用 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 中所述。
我收到了一些代码来检查 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,
此外,还有一些使用 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 中所述。