我正在尝试使用自定义MapEntries实现OrderedMapEntry列表 - 因为我需要一个带有Vectors的自定义解决方案我不能使用TreeMap(http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap. HTML).我实现了一个没有任何错误的自定义列表,但是当我OrderedMapEntries在增强的for循环中使用该类时,它返回一个Object.
使用增强型for循环时,如何确保类型安全?我的实施在确保这种类型安全方面做错了什么?
public class OrderedMapEntries<K, V> implements Iterator, Iterable{
private Vector<MapEntry<K, Vector<V>>> vector;
private int vectorIndex; // initializes with -1
class MapEntry<A, B extends AbstractList<V>> implements Iterator, Iterable{
// MapEntry implementation
public void insert(int index, K key, Vector<V> vec){
MapEntry<K, Vector<V>> mapEntry = new MapEntry<>(key, vec);
vector.add(index, mapEntry);
}
@Override
public MapEntry<K, Vector<V>> next(){
vectorIndex++;
return vector[vectorIndex];
}
}
Run Code Online (Sandbox Code Playgroud)我尝试使用增强的for循环迭代集合,但它失败,因为next()返回一个Object而不是我指定的元素.
OrderedMapEntries<Integer, String> ome = new OrderedMapEntries<>();
// I filled it with some test data
for (OrderedMapEntries<Integer, String>.MapEntry<Integer, Vector<String>> entry : ome){
;
}
Run Code Online (Sandbox Code Playgroud)
MD *_*med 11
您正在实施Iterable,原始类型,而不是Iterable<K>或Iterable<V>.如果省略这样的类型参数,则迭代器的签名变为 -
Iterator iterator();
Run Code Online (Sandbox Code Playgroud)
返回一个Iterator,而不是Iterator<K>或Iterator<V>,其下一个方法将具有如下的签名 -
Object next();
Run Code Online (Sandbox Code Playgroud)
这就是你进入Object增强型for循环的原因,因为它在内部调用Iterator's next来获取下一个元素.
如果使用这样的原始类型,几乎永远不能确保正确的类型安全.有关更多信息,请查看Effective Java,第23项 - 不要在新代码中使用原始类型.
此外,您的OrderedMapEntries类应该只实现Iterable<E>(请查看ArrayList如何执行此操作).iterator在其中实现该方法,使其返回适当Iterator<E>的增强的for循环.