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

时间:2011-06-28 19:42:13

标签: java inheritance methods 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);
}

我想得到类似的实现:

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”是否是真正的单词..哪一个是正确的?

1 个答案:

答案 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>