【发布时间】:2019-09-13 01:40:22
【问题描述】:
所以,问题是:
我有一个抽象基类 (Property),它有一个抽象成员方法 (same())。 same() 方法返回布尔值并应检查是否相等,但“相等”在子类中的解释可能不同,因此我不会覆盖 equals() 或 compareTo()。因为它测试与它类型的另一个对象是否相等,所以签名看起来像这样:
public abstract boolean same(Property other);
现在,当我试图在课堂上覆盖它时,比如说“SubProperty”,我不能使用SubProperty 作为参数的类型。我知道一般原因以及添加类型边界的建议,但由于参数类型是它自己的类,因此事情变得越来越复杂。
有什么流畅的方法可以正确覆盖方法吗?
因为它在其他 StackOverflow 问题中被推荐,所以我尝试使用类型边界(在这种情况下是循环的)。所以,这个类应该是这样的:
public abstract class Property<T extends Property<T>>
和same() 方法:
public abstract boolean same(T other);
对于子类,这意味着:
public class SubProperty extends Property<SubProperty>
还有same()方法:
public boolean same(SubProperty other);
如果我按照建议使用类型边界,这将是结果。它实际上可以构建,但我什至不知道它是否能正常工作。无论如何,它看起来很糟糕且无法维护(尤其是因为我在 Property 中使用了另外两个泛型类型参数)。
我希望有其他方法可以做到这一点。如果重要的话,我使用的是 java 1.8 (openjdk 1.8.0.212-b04)
编辑 1:
因为人们问:same() 不像 equals() 或 compareTo()。是的,它在某种意义上是关于平等的。但实际上我认为这样描述更容易:
same() 是一种检查this 中的something 和同一类的其他一些对象并根据方法中发生的情况返回true 或false 的方法。
编辑 2:
正如@davidxxx 解释的那样,使代码变得“更流畅”似乎是不可能的。我可能会留下基类参数并检查我在方法中得到的对象。毕竟看起来还不错。
【问题讨论】:
-
我真的很困惑为什么你不能为此覆盖
equals。 -
"但是“平等”在子类中的解释可能不同,因此我没有覆盖
equals()或compareTo()"我并没有真正理解你的意思。你能用代码证明你的观点吗?