在ArrayList API中,add()接受泛型参数类型的参数,但是()和indexOf()采用对象类型的参数。
public class ArrayList<E> ...{
public boolean add(E e);
public boolean contains(Object o);
public int indexOf(Object o);
....
}
所以我只是想知道它是与泛型有关还是它的设计是一致的?
我查看了Openjdk实现,但没有找到任何具体的原因。
发布于 2013-01-23 08:39:49
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)));
}
}
如果contains()
仅限于获取Data
,则最后三行将不会编译。
发布于 2013-01-23 08:55:27
以下是一个很好的解释:为什么Set.contains()接受一个对象,而不是E?
https://stackoverflow.com/questions/14484696
复制相似问题