为什么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;
}
}
- 那么为什么它被定义为
equals(Object anObject)而不是作为equals(String anObject)?如果除 之外的任何其他对象都返回 false,那么有机会接收任何对象有什么意义String? - 如果我创建
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)方法。这意味着苹果也必须有这个方法:
- 所有的苹果都是对象。
- 所有对象都有一个
equals(Object)方法 - 所以,苹果有
equals(Object)办法。
那么为什么对象有这个方法呢?因为有用。因为它使ArrayList的contains(Object other)方法打勾,它使 java.util.Set 工作。一旦你决定所有的对象都有一个equals(Object other)方法,剩下的(特别是,苹果有一个equals(Object other)方法,如果你问它是否等于某个非苹果对象,它就会简单地返回 false);现在是这种情况,仅仅是因为我们在这里设置的系统(这是一个协变类型系统,所有类型继承的基本类型都有一个equals(Object)方法)规定它必须如此。
是的,java 语言规范实际上保证了这一点;您无法equals(Object)从 Apple 中“删除”该方法。然而,问题的关键是为什么Java 规范是这样工作的。
THE END
二维码