Java:覆盖子类中的抽象方法

JJ1*_*180 7 java oop

我真的应该知道这一点,但出于某种原因我不理解以下内容.

我的抽象类包含以下抽象方法:

protected abstract RuleDTO createRowToBeCloned(RuleDTO ruleDTO);
Run Code Online (Sandbox Code Playgroud)

我还有另一个课程如下:

EvaluationRuleDTO extends from RuleDTO
Run Code Online (Sandbox Code Playgroud)

然后在我的抽象类的子类中,我有以下实现,由于"必须覆盖或实现超类型方法",这是不允许的:

protected EvaluationRuleDTO createRowToBeCloned(EvaluationRuleDTO ruleDTO) {
Run Code Online (Sandbox Code Playgroud)

但是,允许以下内容:

protected EvaluationRuleDTO createRowToBeCloned(RuleDTO ruleDTO) {
Run Code Online (Sandbox Code Playgroud)

我意识到这可能是一个基本问题,但我有点困惑.为什么我可以在重写方法中返回RuleDTO的子类,但是我不能传入子类?

谢谢

JB *_*zet 11

你打破了Liskov原则:超类可以做的所有事情,子类必须能够做到.超类声明了一种接受任何类型的RuleDTO的方法.但是在您的子类中,您只接受EvaluationRuleDTO的实例.如果您执行以下操作会发生什么?

RuleDTO rule = new EvaluationRuleDTO();
rule.createRowToBeCloned(new RuleDTO());
Run Code Online (Sandbox Code Playgroud)

EvaluationRuleDTO是RuleDTO,因此它必须履行RuleDTO定义的合同.

但是,子类中的方法可能返回EvaluationRuleDTO的实例而不是RuleDTO,因为合同是返回RuleDTO,而EvaluationRuleDTO是RuleDTO.