我正在使用 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 方法应该怎样写?
只需使用
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());
}