Почему Java 5+ API не использует ковариантные типы возвращаемых данных? - PullRequest
10 голосов
/ 20 сентября 2010

Начиная с Java 5 нам разрешено иметь ковариантные возвращаемые типы .Почему Java API не использует это преимущество?

Например, Graphics2D.create().Почему не переопределено возвращать объект Graphics2D?Мне кажется, что это было бы обратно совместимо во всех ситуациях.

Ответы [ 2 ]

12 голосов
/ 20 сентября 2010

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

Поскольку Graphics2D является абстрактным, оно, очевидно, должно быть разделено на подклассы, поэтому применимы приведенные выше рассуждения.

Дженерики и коллекции Java , хотя больше фокусируется на точке зрения дженериков, содержит обсуждение ковариантного переопределения в разделе 8.4.

4 голосов
/ 20 сентября 2010

Это нарушит бинарную совместимость. Ранее скомпилированные классы не могут найти метод с новым типом возврата. JLS3 §13.4.15, §13.4.12

...