首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ArrayList方法中的不一致参数

ArrayList方法中的不一致参数
EN

Stack Overflow用户
提问于 2013-01-23 16:37:45
回答 2查看 113关注 0票数 4

在ArrayList API中,add()接受泛型参数类型的参数,但是()和indexOf()采用对象类型的参数。

代码语言:javascript
运行
复制
public class ArrayList<E> ...{
     public boolean add(E e);  
     public boolean contains(Object o);
     public int indexOf(Object o);
     ....
}

Java Doc for ArrayList

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-23 16:39:49

API的意思是:

  1. 你不能add()任何不是E的东西;
  2. 但是,您可以搜索非E (但可以与E实例相比较)的内容。

请考虑以下示例:

代码语言:javascript
运行
复制
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()仅限于获取Data,则最后三行将不会编译。

票数 10
EN

Stack Overflow用户

发布于 2013-01-23 16:55:27

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14484696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档