为什么String类中的equals方法定义为equals(ObjectanObject)而不是equals(StringanObject)?

这是equals()String

public boolean equals(Object anObject)
{
    if (this == anObject)
    {
        return true;
    }
    else
    {
        if (anObject instanceof String)
        {
            String aString = (String) anObject;
            if (this.coder() == aString.coder())
            {
                return this.isLatin1() ? StringLatin1.equals(this.value, aString.value) : StringUTF16.equals(this.value, aString.value);
            }
        }
        return false;
    }
}
  1. 那么为什么它被定义为equals(Object anObject)而不是作为equals(String anObject)?如果除 之外的任何其他对象都返回 false,那么有机会接收任何对象有什么意义String
  2. 如果我创建MyOwnClass,我应该
    像第一个选项那样重写equals()方法
    equals(Object obj)
    还是像
    equals(MyOwnClass obj)
    If 那样,那为什么?

PS:覆盖时协方差在返回类型中起作用。我认为如果协方差在重写时在返回类型中起作用,那么它也必须在函数参数中起作用。

{
    public A foo(A o)
    {
        return new A();
    }
}

class B extends A
{
    @Override // everything OK
    public B foo(A o)
    {
        return new B();
    }
}

回答

到目前为止,没有答案触及问题的核心。

Java 的类型系统是协变的(直到您进入泛型,您可以在其中选择所需的变体)。

鉴于class Apple extends Fruitand class Fruit extends Object,那么所有的 Apples 也是 Fruits,所有 Fruits 也是 Objects,所有 Apples 也是 Objects

而Object,正因为java.lang.Object如此,才有了equals(Object other)方法。这意味着苹果也必须有这个方法:

  1. 所有的苹果都是对象。
  2. 所有对象都有一个equals(Object)方法
  3. 所以,苹果有equals(Object)办法。

那么为什么对象有这个方法呢?因为有用。因为它使ArrayListcontains(Object other)方法打勾,它使 java.util.Set 工作。一旦你决定所有的对象都有一个equals(Object other)方法,剩下的(特别是,苹果有一个equals(Object other)方法,如果你问它是否等于某个非苹果对象,它就会简单地返回 false);现在是这种情况,仅仅是因为我们在这里设置的系统(这是一个协变类型系统,所有类型继承的基本类型都有一个equals(Object)方法)规定它必须如此。

是的,java 语言规范实际上保证了这一点;您无法equals(Object)从 Apple 中“删除”该方法。然而,问题的关键是为什么Java 规范是这样工作的。


以上是为什么String类中的equals方法定义为equals(ObjectanObject)而不是equals(StringanObject)?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>