gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 01:38:05 25 4
gpt4 key购买 nike

编辑:见底部

首先,我在问这个问题之前搜索了一个答案,但是正如您在标题中看到的那样,我不知道这是怎么称呼的,我会尽可能地编辑这个问题。请原谅我。

我有以下抽象类:

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!

抽象类定义(ValidableDTO)中的以下工作

public abstract <T extends ValidableDTO> boolean equals(T compared);

__但是__

MyDTO 中的实现仍然不够好,最后,它与使用我的“if instanceof”解决方案完全相同,因为 ValidableDTO 是一个抽象类并且必须被继承。

现在使用 Aps 的解决方案是什么样的:

public <T extends ValidableDTO> boolean equals(T compared) { ... }

我仍然需要检查它是否是一个 MyDTO 实例......

旁注,谷歌似乎不知道“有效”或“可验证”是否是真实的词。哪个是正确的?

最佳答案

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

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;
}

这种方法具有使类准备好在集合中使用的额外值(value),这是 DTO 类的一种非常常见的情况(例如 List<UserDTO>)

关于java - 如何声明一个抽象方法,使参数类型(类)始终是Children类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6512202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com