Java: Overriding an abstract method in subclass
java, oop
Solution
You're breaking the Liskov principle: everything a superclass can do, a subclass must be able to do. The superclass declares a method accepting any kind of RuleDTO. But in your subclass, you only accept instances of EvaluationRuleDTO. What would happen if you did the following?
RuleDTO rule = new EvaluationRuleDTO();
rule.createRowToBeCloned(new RuleDTO());
An EvaluationRuleDTO is a RuleDTO, so it must fulfill the contract defined by RuleDTO.
The method in the subclass may return an instance of EvaluationRuleDTO instead of a RuleDTO, though, because the contract is to return a RuleDTO, and EvaluationRuleDTO is a RuleDTO.
Problem
I really should know this, but for some reason I don't understand the following. My abstract class contains the following abstract method: ``` protected abstract RuleDTO createRowToBeCloned(RuleDTO ruleDTO); ``` I also have another class as follows: ``` EvaluationRuleDTO extends from RuleDTO ``` Then in a subclass of my abstract class I have the following implementation which is not allowed due to "must override or implement a supertype method": ``` protected EvaluationRuleDTO createRowToBeCloned(EvaluationRuleDTO ruleDTO) { ``` However, the following is allowed: ``` protected EvaluationRuleDTO createRowToBeCloned(RuleDTO ruleDTO) { ``` I realize this is probably a basic question but I am a little bemused. How come I can I can return a subclass of RuleDTO in the overridden method, but I can't pass in a subclass? Thanks