【发布时间】:2021-07-05 06:00:37
【问题描述】:
我正在尝试编写一个通用的培训类。
public class Pair<T> {
T first;
T second;
private Pair(T first, T second){
this.first=first;
this.second=second;
}
public T getFirst(){
return first;
}
public T getSecond(){
return second;
}
}
我让 ide 自己添加 equals 和 hash。结果,她写了这个实现:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Pair<?> pair = (Pair<?>) o;
return Objects.equals(first, pair.first) && Objects.equals(second, pair.second);
}
@Override
public int hashCode() {
return Objects.hash(first, second);
}
由于我还没有弄清楚,所以我不明白这一行:
Pair<?> pair = (Pair<?>) o;
为什么是<?>?她会把什么样的人放在那里,又会从哪里拿走?
我知道 Pair<T> pair = (Pair<T>) o; 错了,因为会删除 type ,但是 >给我们?我很乐意帮助您解决问题,谢谢。
【问题讨论】:
-
Objects.equals(...)不关心对象类型,它只是比较Object类型的两个实例。因此,first和second的类型无关紧要,无论如何它们都会被隐式转换为Object,所以Pair<?>只是承认这一事实,将其留给 @987654332 @ 对象的方法来验证匹配类型。