java为什么字符串类中的equals方法定义为equals(Object anObject),而不是equals(String anObject)?
这是来自String
类的equals()
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)
? 如果除String
之外的任何其他对象返回false,那么有机会接收任何对象有什么意义李> - 如果我创建了
MyOwnClass
,我应该将equals()
方法重写为
equals(Object obj)
或作为
equals(MyOwnClass obj)
如果与第一个选项相同,那么为什么李>
注意:覆盖时协方差以返回类型工作。我认为,如果在重写时协方差在返回类型中起作用,那么它也必须在函数参数中起作用
{
public A foo(A o)
{
return new A();
}
}
class B extends A
{
@Override // everything OK
public B foo(A o)
{
return new B();
}
}
# 1 楼答案
class String
重写具有以下签名的^{在重写的情况下,子类中的方法签名(名称和参数)必须与超类中的方法签名相同。如果更改参数的数量和/或类型,则该方法将重载,而不是重写
您应该将其覆盖为
否则,它不会被覆盖;相反,它会像上面提到的那样过载
# 2 楼答案
给定两个
Object
,您可以合法地询问它们是否相等,即使具体类型是Integer
和String
equals
方法需要接受最通用的类型第一个。如果使用第二种方法,则仅当接收器和参数的类型都为
MyOwnClass
(如receiver.equals(parameter)
)时才会调用它。否则,将调用来自Object
的equals(Object)
,因为方法重载由编译器解决,并且equals(Object)
是编译器知道的唯一匹配接收方和参数的方法# 3 楼答案
到目前为止,没有一个答案能够触及问题的核心
Java的输入系统是协变的(直到您进入泛型,在这里您可以选择所需的协变)
假设
class Apple extends Fruit
和class Fruit extends Object
,那么所有苹果也是水果,所有水果也是对象,所有苹果也是对象对象,因为
java.lang.Object
这样说,所以它有一个equals(Object other)
方法。这意味着苹果必须也有此方法:equals(Object)
方法equals(Object)
方法李>那么为什么对象有这种方法呢?因为它很有用。因为它使
ArrayList
的contains(Object other)
方法滴答作响,所以它使java。util。开始工作。一旦您确定所有对象都有一个equals(Object other)
方法,其余的(特别是,苹果有一个equals(Object other)
方法,如果您询问它是否等于某个非苹果对象,它通常会返回false)被锁定;现在的情况就是这样,因为我们在这里设置的系统(这是一个协变类型系统,所有类型继承自的基类型都有一个equals(Object)
方法)规定它必须如此是的,java语言规范实际上保证了这一点;无法从Apple中“删除”
equals(Object)
方法。然而,java的关键是它为什么会这样