Witam!
Być może w temacie niezbyt jasno się wyraziłem dlatego może jakiś przykład:
1. Chcemy stworzyć obiekt typu LinkedList. W literaturze, najczęściej spotykany zapis tego procesu to:
List<String> list = new LinkedList<String>();
2. Chcemy stworzyć obiekt typu HashSet. W literaturze spotkamy to:
Set<Integer, String> list = new HashSet<Integer, String>();
Teraz jest już chyba jasne o co chodzi. Dlaczego referencja jest deklarowana z nadklasy obiektu który tworzymy? Czy odnosimy z tego tytułu jakąś korzyść? Bo moim zdaniem przysparza to raczej problemów. Jak wiadomo kompilator nie patrzy na obiekt tylko na referencje. W związku z tym gdy w nadklasie nie będzie metody którą wywołujemy dostaniemy ComplieError. Skoro tak to logika podpowiada żeby deklarować jak "najniższe" referencje (najbliższe albo po prostu te same względem obiektu który tworzymy).
Dlaczego więc tego nie robimy i dlaczego warto deklarować typ postawiony wyżej w hierarchii dziedziczenia?
Dziękuję :)