【问题标题】:In `equals(T value)`, must T be Object, or can it be like City, etc?在 `equals(T value)` 中,T 必须是 Object,还是可以像 City 等?
【发布时间】:2010-07-17 16:31:33
【问题描述】:

我正在尝试更好地理解equals() 方法。我见过的所有例子都是这样的:

public class City
{
    public boolean equals(Object other)
    {
        if (other instanceof City && other.getId().equals(this.id))
        {
            return true;
        }

        // ...
    }
}

该方法必须采用 Object 而不是 City 吗?

例如这是不允许的吗?

public class City
{
    public boolean equals(City other)
    {
        if (other == null)
        {
            return false;
        }

        return this.id.equals(other.getId());
    }
}

【问题讨论】:

    标签: java equals referenceequals


    【解决方案1】:

    是的,它必须是Object。否则,您不是覆盖 真实 Object#equals(),而是重载它。

    如果您只是重载它,那么它不会被标准 API 使用,例如 Collection API 等。

    相关问题:

    【讨论】:

    • 并使用@Override 确保您没有犯错。
    • 有问题吗?有什么作用?
    • 它的作用是你认为你写的equals方法不会被使用
    【解决方案2】:

    你可以同时拥有:(参见上面 poke 的评论)

    public class City
    {
        public boolean equals(Object other)
        {
            return (other instanceof City) && equals((City)other) ;
        }
        public boolean equals(City other)
        {
            return other!=null && this.id.equals(other.getId());
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果您想覆盖 equals(),请不要使用 Object 以外的任何其他内容!

      编写专门的 equals() 方法是一个常见错误,但往往会违反 equals() 协定。

      【讨论】:

      • 你可以同时做这两个,用一个特殊的 equals( City ) 方法重载它,专门检查两个城市,然后覆盖原来的 equals( Object ) 方法,如果你调用 equals( City )传递的对象是一个城市,否则做其他事情(比如总是返回 false)。
      • @poke - 好点子+1!我发现自己经常这样做,在极少数情况下它会对性能产生积极影响。
      • 你们两个当然是对的。我的意思是,这通常会导致容易出错的代码。只要你知道自己在做什么并正确使用覆盖注释,没什么大不了的。
      猜你喜欢
      • 2021-09-09
      • 1970-01-01
      • 2013-05-31
      • 2023-03-28
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      • 2011-06-29
      • 2020-04-03
      相关资源
      最近更新 更多