2010-09-20 5 views
9

С Java 5 нам разрешено иметь covariant return types. Почему Java API не использует это?Почему API Java 5+ не использует ковариантные типы возврата?

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

ответ

11

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

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

Java Generics and Collections, хотя основное внимание уделяется общей точке зрения, содержит обсуждение ковариантного переопределения в разделе 8.4.

4

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

 Смежные вопросы

  • Нет связанных вопросов^_^