Specializing method arguments in subclasses in Java

后端 未结 2 554
[愿得一人]
[愿得一人] 2021-01-12 16:42

Consider the following situation:

public abstract class AnimalFeed{
}
public class FishFeed extends AnimalFeed{
}
public class BirdFeed extends AnimalFeed{
}         


        
2条回答
  •  无人及你
    2021-01-12 17:29

    What you are asking for doesn't make sense from an theoretical point of view.

    Restricting a method parameter violates the Liskov Substitution Principle.

    The idea there: any occurance (usage) of some base class object must be able to deal with some sub class object, too.

    A more simple example: when your base interface goes:

    void foo(Number n)
    

    then you must not do

    @Override
    void foo(Integer i)
    

    in a subclass. Because all of a sudden, a caller

    someObject.foo(someNumber)
    

    would run into ugly ugly problems when someObject is of that derived class; which only accepts Integers, but not Numbers.

    In other words: good OO design is much more than just writting down A extends B. You have to follow such rules; or you end up with systems are already broken on a conceptual point!

    And for the record: it is theoretically valid to widen method parameters (in general, but in Java); and it is also ok to restrict the return types of methods (because these changes can not break client code; and that even works in Java).

    Long story short: the answer here is too change your design; for example by using Generics and dependent interfaces to somehow create a relationship between the Animal and the Feed class hierarchy.

提交回复
热议问题