使用泛型参数化类进行转换的 Equals 方法

问题描述 投票:0回答:1

我正在使用 Java 21。

我正在尝试为

MyClass<T>
编写一个 equals 方法,它定义了一个嵌套类
MyNested<T> extends Comparable
和一个
getNested()
方法,该方法返回在构造期间定义的
MyNested<T>
类的实例和
MyClass<T> 的实例
.

我不清楚如何正确执行此操作。

如果我这样做:

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if ((obj == null) || (this.getClass() != obj.getClass())) return false;
        MyClass<?> other = (MyClass<?>) obj;
        return this.getNested().compareTo(other.getNested()) == 0;
    }

我收到编译错误:

java: incompatible types: MyClass.MyNested<capture#1 of ?> cannot be converted to MyClass.MyNested<T>

发生这种情况是因为

MyNested.compareTo(...)
方法需要
MyNested<T>
类型的对象,但
other.getNested()
返回
MyNested<?>
类型的对象。

如果我这样做:

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if ((obj == null) || (this.getClass() != obj.getClass())) return false;
        MyClass<T> other = (MyClass<T>) obj;
        return this.getNested().compareTo(other.getNested()) == 0;
    }

我的 IDE 抱怨:

Unchecked cast: 'java.lang.object' to 'MyClass<T>'
我可以通过添加来消除它
@SuppressWarnings("unchecked")
在强制转换之前的行上,但我不确定这是正确的做法,因为我不相信对前一行的
this.getClass() != obj.getClass()
检查保证泛型类型是相同的,只是类是一样。

在这种情况下,正确的 equals 方法应该怎样写?

java generics casting equals suppress-warnings
1个回答
0
投票

只需使用

equals
(或
Objects.equals
实用方法)而不是
compareTo
,例如:

@Override
public boolean equals(Object obj) {
    if (this == obj) return true;
    if (obj == null || getClass() != obj.getClass()) return false;
    MyClass<?> other = (MyClass<?>) obj;
    return Objects.equals(getNested(), other.getNested());
}
© www.soinside.com 2019 - 2024. All rights reserved.