4

在 ArrayList API中add()接受泛型参数类型的参数,但contains()indexOf()接受Object类型的参数。

public class ArrayList<E> ...{
     public boolean add(E e);  
     public boolean contains(Object o);
     public int indexOf(Object o);
     ....
}

ArrayList 的 Java 文档

所以我只是想知道它是否与泛型有关还是它的设计不一致?

我查看了Openjdk实现,但找不到任何具体原因。

4

2 回答 2

10

API 的意思是:

  1. 你不能add()做任何不是E;
  2. 但是,您可以搜索不存在的东西E(但可以比较等于 的实例E)。

考虑以下示例:

public class Main {
    public static class Key {
        private final int k;
        public Key(int k) {
            this.k = k;
        }
        @Override
        public boolean equals(Object obj) {
            if (!(obj instanceof Key)) {
                return false;
            }
            Key rhs = (Key)obj;
            return k == rhs.k;
        }
        @Override
        public int hashCode() {
            //...
            return 0;
        }
    }
    public static class Data extends Key {
        private final int d;
        public Data(int k, int d) {
            super(k);
            this.d = d;
        }
    }
    public static void main(String[] args) {
        List<Data> l = new ArrayList<Data>();
        l.add(new Data(123, 456));
        l.add(new Data(42, 24));
        System.out.println(l.contains(new Key(789)));
        System.out.println(l.contains(new Key(123)));
        System.out.println(l.contains(new Key(42)));
    }
}

contains()如果仅限于 take ,最后三行将无法编译Data

于 2013-01-23T16:39:49.937 回答
3

这是一个很好的解释:为什么 Set.contains() 接受一个对象,而不是 E?

于 2013-01-23T16:55:27.467 回答