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

dom*_*ri7 4 java methods inheritance abstract-class

编辑:见底部

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

我有以下抽象类:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

我能得到的最接近的是

@Override
public boolean equals(ValidableDTO compared) {
    boolean isEqual = false;

    if (compared instanceof MyDTO) {
        isEqual = getValue().equals(compared.getValue());
    }

    return isEqual;
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用public abstract boolean equals(<? extends ValidableDTO> compared);但这不起作用.

这是否可能(应该是IMO)?谢谢你的时间和...我仍然不知道如何在一句话中描述这个......(笑)

真诚.- 我

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

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

public abstract <T extends ValidableDTO> boolean equals(T compared);
Run Code Online (Sandbox Code Playgroud)

__ 但是 __

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

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

public <T extends ValidableDTO> boolean equals(T compared) { ... }
Run Code Online (Sandbox Code Playgroud)

我还是要检查它是否是MyDTO实例...

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

maa*_*asg 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
    }
}
Run Code Online (Sandbox Code Playgroud)

[编辑]

以下评论摘要摘要:

关于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; 
}
Run Code Online (Sandbox Code Playgroud)

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