Java ArrayList方法中的参数不一致

Java ArrayList方法中的参数不一致,java,Java,在ArrayList API中,add()接受泛型参数类型的参数,但包含()和indexOf()接受对象类型的参数 public class ArrayList<E> ...{ public boolean add(E e); public boolean contains(Object o); public int indexOf(Object o); .... } 公共类ArrayList{ 公共布尔加法(E); 公共布尔包含(对象o

在ArrayList API中,add()接受泛型参数类型的参数,但包含()indexOf()接受对象类型的参数

public class ArrayList<E> ...{
     public boolean add(E e);  
     public boolean contains(Object o);
     public int indexOf(Object o);
     ....
}
公共类ArrayList{
公共布尔加法(E);
公共布尔包含(对象o);
公共int索引of(对象o);
....
}

所以我只是想知道这是与泛型有关还是与一致性设计有关


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

API所说的是:

  • 你不能
    add()
    任何不是
    E
    的东西
  • 但是,您可以搜索不属于
    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)));
        }
    }
    
    公共类主{
    公共静态类密钥{
    私人终审法院;
    公钥(INTK){
    这个。k=k;
    }
    @凌驾
    公共布尔等于(对象obj){
    如果(!(obj键实例)){
    返回false;
    }
    键rhs=(键)obj;
    返回k==rhs.k;
    }
    @凌驾
    公共int hashCode(){
    //...
    返回0;
    }
    }
    公共静态类数据扩展密钥{
    非公开期末考试;
    公共数据(整数k,整数d){
    超级(k);
    这个。d=d;
    }
    }
    公共静态void main(字符串[]args){
    列表l=新的ArrayList();
    l、 增加(新数据(123456));
    l、 增加(新数据(42,24));
    System.out.println(l.contains(新键(789));
    System.out.println(l.contains)(新键(123));
    System.out.println(l.contains)(新键(42));
    }
    }
    

    如果
    contains()。例如,您可以有一个
    列表
    和一个
    编号
    ,并且能够检查
    编号
    是否在
    列表
    @rai.skumar中:我在答案中添加了一个示例。请参阅