Одна проблема в том, что Stack - это класс, а не интерфейс. Это отличается от дизайна структуры коллекции, где ваше существительное обычно представляется как интерфейс (например, List, Tree, Set и т. Д.), И существуют конкретные реализации (например, ArrayList, LinkedList). Если бы Java могла избежать обратной совместимости, то более правильным проектом было бы иметь интерфейс Stack, а затем VectorStack в качестве реализации.
Вторая проблема заключается в том, что Stack теперь привязан к Vector, чего обычно избегают в пользу ArrayLists и т. П.
Третья проблема заключается в том, что вы не можете легко предоставить собственную реализацию стека, и эти стеки поддерживают очень не стековые операции, такие как получение элемента из определенного индекса, включая потенциальные исключения индекса. Как пользователь, вам также может понадобиться узнать, находится ли вершина стека по индексу 0 или по индексу n. Интерфейс также предоставляет подробности реализации, такие как емкость.
Из всех решений в исходной библиотеке классов Java я считаю это одним из наиболее специфических решений. Я сомневаюсь, что агрегация была бы намного дороже, чем наследование.