【问题标题】:Why does the IDE cast to the type <?> inside the equals method that he generated for the generic class?为什么 IDE 在他为泛型类生成的 equals 方法中强制转换为 <?> 类型?
【发布时间】: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;

为什么是&lt;?&gt;?她会把什么样的人放在那里,又会从哪里拿走? 我知道 Pair&lt;T&gt; pair = (Pair&lt;T&gt;) o; 错了,因为会删除 type ,但是 >给我们?我很乐意帮助您解决问题,谢谢。

【问题讨论】:

  • Objects.equals(...) 不关心对象类型,它只是比较Object 类型的两个实例。因此,firstsecond 的类型无关紧要,无论如何它们都会被隐式转换为 Object,所以 Pair&lt;?&gt; 只是承认这一事实,将其留给 @987654332 @ 对象的方法来验证匹配类型。

标签: java generics


【解决方案1】:

Pair&lt;?&gt;Pair&lt;? extends Object&gt; 的语法糖 这意味着您的 eaquls 方法将接受一个对象或一个类扩展对象。

您可以查看此主题以获取更多详细信息 Generics what does <?> actually mean?

【讨论】:

  • 如果你做一个Pair,那么>是String还是Object?
  • @Alpharius:两者都不是。是?,表示代码不知道。
  • @Alpharius,声明 public class Pair {} 没有任何意义,它总是像 T 这样的通用参数,就好像你写 class Pair {}
  • @MaroineMlis 如果我理解正确的话,我很感兴趣的是替换字符串而不是 T
  • 如果你有 Pair p1 = new Pair("A","B");对 p2 = new Pair("C","D");并尝试调用 p1.equals(p2) 运行时级别的 equals 方法不会因为这一行而改变 Pair> pair = (Pair>) o;但“第一”和“第二”属性将是字符串字段
猜你喜欢
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
相关资源
最近更新 更多