java - 如何为泛型对实现 equals?

标签 java generics equals type-systems

只是为了好玩,我正在尝试用 Java 实现一个通用的 Pair 类。我遇到了 equals 的问题:

public class Pair<A, B>
{
    public final A _1;
    public final B _2;

    // ... unnecessary details left out ...

    public boolean equals(Pair<A, B> that)
    {
        return (_1.equals(that._1)) && (_2.equals(that._2));
    }

    @Override
    public boolean equals(Object o)
    {
        return (o instanceof Pair<A, B>) && equals((Pair<A, B>) o);
    }
}

然而,o instanceof Pair<A, B>似乎不起作用。这是为什么?

使用 (o instanceof Pair) && equals((Pair<A, B>) o)给我一个 Actor 警告。摆脱 <A, B>类型转换上的部分仍然给我一个警告,我想这也是有道理的。

这是否意味着 Java 无法阻止客户端比较具有不同类型参数的 Pair?

最佳答案

Does that mean Java cannot prevent clients from comparing Pairs with different type arguments?

是的,但这就是重点——equals 应该适用于任意对象。你想要的样子

@Override
public boolean equals(Object o)
{
    if (o instanceof Pair) {
       Pair<?, ?> pair = (Pair<?, ?>) o;
       return _1.equals(pair._1) && _2.equals(pair._2);
    }
    return false;
}

但这应该没问题,只要 AB 有适当的 equals 实现,它可以接受任意 Objects.

关于java - 如何为泛型对实现 equals?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15957729/

相关文章:

java - Android 工具栏设置背景颜色为半透明颜色

java - 使用鼠标和图形缩放

java - GWT序列化: polymorphism with generics

css - 将图像的高度设置为动态宽度(仅使用 CSS)

python - 判断两个字典是否相等Python错误

java - 无法连接到 Spotify Kafka 容器,基本连接问题

java - 确定哪个面板被压入以及哪个面板被释放

Java泛型类型问题

c# - 以类型泛型/不可知的方式实现泛型方法的最佳方法

c# - 重载 operator== 与 Equals()