如何声明一个抽象方法,以便参数类型(类)始终是Children类?

编辑:见底部

首先我在问这个问题之前搜索了一个答案,但正如你可以看到标题我不知道如何调用它,我会尽可能地编辑问题。 请原谅我这个。

我有以下抽象类:

public abstract class ValidableDTO implements Serializable { public abstract boolean isValid(); public abstract boolean equals(ValidableDTO compared); // EDIT : new solution public abstract  boolean equals(T compared); } 

我想得到一个类似的实现:

 public class MyDTO extends ValidableDTO { private String myValue; //With a getter and setter of course public MyDTO() { // ... } @Override public boolean isValid() { return true; // Validation } // __________ LOOK AT THE FOLLOWING PARAMETER TYPE __________ @Override public boolean equals(MyDTO compared) { return true; // Comparison } } 

我能得到的最接近的是

 @Override public boolean equals(ValidableDTO compared) { boolean isEqual = false; if (compared instanceof MyDTO) { isEqual = getValue().equals(compared.getValue()); } return isEqual; } 

我尝试使用public abstract boolean equals( compared); 但这不起作用。

这是否可能应该是IMO)? 谢谢你的时间和…我仍然不知道怎么用一句话来形容这个……(笑)

真诚。 – 我

更进一步,感谢用户:aps!

以下适用于Abstract类定义(ValidableDTO)

 public abstract  boolean equals(T compared); 

__ 但是 __

MyDTO中的实现仍然没有问题,最后,它与使用我的’if instanceof’解决方案完全相同,因为ValidableDTO是一个抽象类,而HAS是要inheritance的。

现在看起来使用Aps的解决方案:

 public  boolean equals(T compared) { ... } 

我仍然需要检查它是否是MyDTO实例…

在旁边注意,谷歌似乎不知道“可validation”或“validation”是否是真正的单词..哪一个是正确的?

您可以使用generics来实现抽象类中方法签名的声明:

 public abstract class ValidableDTO implements Serializable { public abstract boolean isValid(); public abstract boolean equals(T compared); } public class MyDTO extends ValidableDTO { @Override public boolean isValid() { ... } @Override public boolean equals(MyDTO compared) { return true; // Comparison } } 

[编辑]

以下评论摘要摘要:

关于Java编码风格和原则,覆盖默认的public boolean equals(Object other)方法而不是使用generics构造来尝试约束参数的类型会更合理。 equals(…)的标准做法是使用instaceof运算符检查参数兼容性,执行强制转换并在特定对象结构级别使用更精细的比较。 这类似于原帖中提议的替代实现。

  @Override public boolean equals(Object other) { if (this == other) return true; if (other instanceof MyDTO) { MyDTO otherDTO = (MyDTO) other; return this.getValue().equals(otherDTO.getValue()); // mind null values } return false; } 

这种方法具有使类准备好在集合中使用的附加价值,这是DTO类的一种非常常见的情况(例如List