java - 泛型:为什么实现的集合返回一个对象而不是指定的类型?

标签 java generics

我正在尝试使用自定义 MapEntries 实现一个 OrderedMapEntry 列表 - 因为我需要一个带有 Vectors 的自定义解决方案,所以我不能使用 TreeMap( http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html )。我实现了一个自定义列表,没有任何错误,但是当我在增强的 for 循环中使用 OrderedMapEntries 类时,它返回一个 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]; 
        }
    }
    

我尝试使用增强的 for 循环遍历集合,但它失败了,因为 next() 返回一个对象而不是我指定的元素。

OrderedMapEntries<Integer, String> ome = new OrderedMapEntries<>();
// I filled it with some test data

for (OrderedMapEntries<Integer, String>.MapEntry<Integer, Vector<String>> entry : ome){
    ; 
    }

最佳答案

您正在实现 Iterable , 原始类型,不是 Iterable<K>Iterable<V> .如果像这样省略类型参数,那么 iterator 的签名变成 -

Iterator iterator();

返回 Iterator , 不是 Iterator<K>Iterator<V> , 谁的 next方法将具有如下签名 -

Object next();

这就是您获得 Object 的原因在增强的 for 循环中,因为它在内部调用 Iteratornext获取下一个元素。

如果您使用这样的原始类型,您几乎永远无法确保适当的类型安全。更多信息,请查看Effective Java , Item 23 - 不要在新代码中使用原始类型

此外,您的 OrderedMapEntries类应该只实现 Iterable<E> (请查看 ArrayList 是如何做到这一点的)。实现 iterator其中的方法,以便它返回适当的 Iterator<E>到增强的 for 循环。

关于java - 泛型:为什么实现的集合返回一个对象而不是指定的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20090405/

相关文章:

java - 初学者Q : how to open a file in Java and keep it open

java - Enthuware 示例 - hashCode 和 equals

java - 使用泛型进行选择排序

Java 泛型不允许我向列表中添加另一个项目

java - 如何使用 API 获取 Bitbucket 存储库中的所有问题

java - invokeAny 是取消线程池中的所有线程还是仅取消可调用线程?

java - Android:BitmapFactory.decodeByteArray - 降低图像质量

java - 使用java在数组列表中追加特定对象?

具有多个泛型的 Java 泛型数组声明?

C++:遍历泛型列表