gpt4 book ai didi

java - ArrayList 方法中的参数不一致

转载 作者:搜寻专家 更新时间:2023-11-01 01:13:33 25 4
gpt4 key购买 nike

在 ArrayList API 中,add() 接受一个通用参数类型的参数,但是 contains()indexOf() 接受一个类型的参数对象

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

Java Doc for ArrayList

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

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

最佳答案

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() 仅限于获取 Data,则最后三行将无法编译。

关于java - ArrayList 方法中的参数不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14484696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com