![]() |
1
37
Java中的所有对象都继承自
如果您的接口包含其他方法,如果您不通过提供这些方法的实现来完全实现接口,Java会抱怨。但在这种情况下
一种方法是在接口中提供不同的方法,比如,
|
![]() |
2
39
听起来你很想 力 类来重写这些方法的默认实现。如果是这样,那么实现这一点的方法就是声明一个抽象超类,该类具有声明为抽象的方法。例如:
然后将当前类更改为
这种方法是可行的,但它不是一个理想的解决方案。
回到关于接口为什么不强制类重新声明这些方法的实际问题:
一个接口强加了一个约束,即实现它的具体类对每个方法都有一个实现。但是,它并不要求
它本身
实现这些方法。方法实现可以从超类继承。在这种情况下,就是这样。继承自的方法
JLS 8.1.5 声明如下:
|
![]() |
3
17
所有3种方法都由
|
![]() |
4
7
实现接口的任何类也会扩展对象。对象定义hashcode、equals和toString,并具有这三个对象的默认实现。 你试图达到的目标是好的,但并不可行。 |
![]() |
5
5
这些方法的实现来自
|
![]() |
6
5
如果要强制重写equals()和hashcode(),请从抽象超类进行扩展,该类将这些方法定义为抽象的。 |
![]() |
7
4
您的对象已经包含这三个方法的实现,因为每个对象都从对象继承这些方法,除非它们被重写。 |
![]() |
8
3
Java只关心方法是在什么地方定义的。接口并不强制您重新定义新类中第一次从接口继承的方法(如果已经定义了这些方法)。自从
|
![]() |
9
3
其他人已经充分回答了你的实际问题。对于特定问题的解决方案,您可以考虑创建自己的方法(可能是GetStringRepresentation、GetCustomHashCode和EqualSobject),并让您的对象扩展一个基类,其equals、ToString和HashCode方法调用这些方法。 不过,这可能会首先破坏使用接口的目的。这是一些人建议Equals、ToString和HashCode不应该首先包含在对象类中的原因之一。 |
![]() |
10
1
亚当给了你一个理由,为什么你不能逃避强迫平等,哈希代码和ToString。我将进行以下实现,涉及到Adam和Stephan提供的解决方案:
现在,任何需要自己明确区分并表示为字符串的类都可以扩展DistinctStringableObject,这将强制实现checkEquals、hashcode和toString。 样品混凝土等级:
|
![]() |
11
0
如果您有一个孙子,抽象类将不起作用,因为它的父亲已经重写了equals和hashcode方法,然后您又遇到了问题。 尝试使用annotatins和apt( http://docs.oracle.com/javase/1.5.0/docs/guide/apt/GettingStarted.html )完成任务。 |
![]() |
12
-2
如果你已经声明了一个接口,默认情况下所有方法都是抽象的,你确实需要提供功能,但是当你在子类中实现它时,你就提供了实现权利。 如您所见,每个类都是一个超类的子类(简单地说,对象就是所有类的超类)。 因此,如果您有一个实现接口的类,那么您需要为这些方法提供实现。但这里有件事需要记住。 不管怎样,如果您没有在接口中声明这些方法,那么对于首先实现接口的子类,您仍然有这种行为。 因此,如果不声明它,它仍然存在,另一件事是,由于对象类的这些方法和其他方法对于类的所有对象都存在,所以不需要实现。 |
|
synthax · 具有容差级别的双精度哈希方法 7 年前 |
![]() |
Relaxsingh · 附加导师程序无法正常工作***阅读说明*** 7 年前 |
|
user8589267 · 我的equals方法有什么问题? 7 年前 |
![]() |
James W. · 带有通配符的java黑名单 7 年前 |