В общем, это действительно для обеспечения обратной совместимости. Обратите внимание, что совместимость также должна поддерживаться на уровне байт-кода, а изменение типа возвращаемого значения приводит к изменению байт-кода. Таким образом, в общем, если есть какие-либо подклассы, которые могли бы переопределить данный метод, переключение на ковариантный тип возвращаемого значения нарушило бы эти классы.
Поскольку Graphics2D
является абстрактным, оно, очевидно, должно быть разделено на подклассы, поэтому применимы приведенные выше рассуждения.
Дженерики и коллекции Java , хотя больше фокусируется на точке зрения дженериков, содержит обсуждение ковариантного переопределения в разделе 8.4.