编辑:见底部
首先我在问这个问题之前搜索了一个答案,但正如你所看到的标题我不知道如何调用它,我会尽可能地编辑问题。 请原谅我。
我有以下抽象类:
public abstract class ValidableDTO implements Serializable {
public abstract boolean isValid();
public abstract boolean equals(ValidableDTO compared);
// EDIT : new solution
public abstract <T extends ValidableDTO> 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(<? extends ValidableDTO> compared);
,但这不起作用。
甚至可能( 应该是IMO)?谢谢你的时间和...我仍然不知道如何用一句话来描述......(笑)
此致。 - 我
更近一步,感谢用户:aps!
以下适用于Abstract类定义(ValidableDTO)
public abstract <T extends ValidableDTO> boolean equals(T compared);
__ BUT __
MyDTO中的实现仍然没有问题,最后,它与使用我的'if instanceof'解决方案完全相同,因为ValidableDTO是一个抽象类,而且HAS是要继承的。
现在使用Aps解决方案看起来如何:
public <T extends ValidableDTO> boolean equals(T compared) { ... }
我仍然需要检查它是否是MyDTO实例......
在旁边注意,google似乎不知道“Validable”或“Validatable”是否是真正的单词..哪一个是正确的?
答案 0 :(得分:9)
您可以在抽象类的方法签名声明中使用泛型来实现这一点:
public abstract class ValidableDTO<T extends ValidableDTO> implements Serializable {
public abstract boolean isValid();
public abstract boolean equals(T compared);
}
public class MyDTO extends ValidableDTO<MyDTO> {
@Override
public boolean isValid() {
...
}
@Override
public boolean equals(MyDTO compared) {
return true; // Comparison
}
}
<强> [编辑] 强>
以下评论摘要摘要:
关于Java编码样式和原则,覆盖默认的public boolean equals(Object other)
方法而不是使用泛型构造来尝试约束参数的类型会更合理。 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<UserDTO>
)