Q:

Почему класс Properties расширяет Hashtable?

Будучи ещё только неработающим студентом, я не могу позволить себе думать, что разработчики стандартной библиотеки допускают столь заметные промахи, поэтому хочу уточнить, может в этом есть какой-то сакральный смысл?
В общем из-за того что, Properties extends Hashtable<Object,Object> мы ведь имеем кучу проблем, типа:

Because Properties inherits from Hashtable, the put and putAll methods
  can be applied to a Properties object. Their use is strongly
  discouraged as they allow the caller to insert entries whose keys or
  values are not Strings.

Почему нельзя было принять другое решение, типа Properties extends Hashtable<String,String>? Или вообще использовать композицию, чтобы не было возможности вызывать методы из класса Hashtable, а видны были только открытые методы самого класса Properties?

A:

Обратите внимание, что в javadoc-е класса  java.util.Properties есть пометка @since JDK1.0. Т.е. класс существует со времен версии JDK 1.0.
Это обстоятельство влечет за собой пару последствий:

Поскольку это была первая версия API, то у разработчиков действительно был простор для неловких решений и косяков. Среди классов, появившихся до Java 5 можно найти немало таких примеров. Взять хотя бы java.net.URL.
До Java 5 не существовало обобщенных типов. То есть на самом деле Properties наследовал не Hashtable<Object,Object>, а просто Hashtable. После появления generic-ов Hashtable стал эквивалентен Hashtable<Object,Object>. И для поддержания краеугольного камня Java - обратной совместимости - нельзя было изменить контракт и начать использовать Hashtable<String,String>.

