如何声明一个抽象方法,以便参数类型(类)始终是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
)