ArrayList方法中的参数不一致

rai*_*mar 4 java

在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);
     ....
}
Run Code Online (Sandbox Code Playgroud)

用于ArrayList的Java Doc

所以我只是想知道它是否与Generics有关或它的设计是否一致?

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

NPE*_*NPE 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)));
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • @ rai.skumar你可以去寻找一个超级型的"E".例如,你可以有一个`List <Integer>`和一个`Number`,并且能够检查`Number`是否在`List`中 (2认同)