Существуют ли конкретные примеры обратной несовместимости между версиями Java? - PullRequest
47 голосов
/ 31 октября 2009

Были ли несовместимости между выпусками Java, когда исходный код Java / файлы классов Java, ориентированные на версию X Java, не будут компилироваться / выполняться в версии Y (где Y> X)?

Под «выпуском Java» я подразумеваю такие версии, как:

  • JDK 1.0 (январь 1996 г.)
  • JDK 1.1 (февраль 1997 г.)
  • J2SE 1.2 (декабрь 1998 г.)
  • J2SE 1.3 (май 2000 г.)
  • J2SE 1.4 (февраль 2002 г.)
  • J2SE 5.0 (сентябрь 2004 г.)
  • Java SE 6 (декабрь 2006 г.)

Правила дома:

  • Пожалуйста, включите ссылки и примеры кода, где это возможно.
  • Пожалуйста, постарайтесь быть очень конкретным / конкретным в своем ответе.
  • Класс, помеченный как @Deprecated, не считается обратной несовместимостью.

Ответы [ 14 ]

3 голосов
/ 31 октября 2009

Еще один пример нарушения совместимости java.sql:

В версии 1.5 метод сравнения (Дата) был добавлен в java.sql.Timestamp. Этот метод генерировал бы исключение ClassCastException, если предоставленная Date не была экземпляром java.sql.Timestamp. Конечно, java.sql.Timestamp расширяет Date, а у Date уже был метод compareTo (Date), который работал со всеми датами, поэтому это означало, что код, сравнивающий метку времени с датой (не являющейся меткой времени), прервался бы во время выполнения в 1.5 .

Интересно отметить, что, похоже, 1.6 исправил эту проблему. Хотя документация для java.sql.Timestamp.compareTo (Date) по-прежнему гласит «Если аргумент не является объектом Timestamp, этот метод выдает объект ClassCastException», фактическая реализация говорит об обратном. Я предполагаю, что это ошибка документации.

2 голосов
/ 31 октября 2009

Я не пробовал, но теоретически это будет работать в Java 1.1 и ломаться в Java 1.2. (Подробнее информация здесь )

public class Test {
    float strictfp = 3.1415f;
}
2 голосов
/ 31 октября 2009

Как сказал Шон Рейли, новый метод может сломать ваш код. Помимо простого случая, когда вам нужно реализовать новый метод (это приведет к предупреждению компилятора), есть худший случай: новый метод в интерфейсе имеет такую ​​же сигнатуру , как метод, который вы уже использовали в твой класс. Единственная подсказка компилятора - предупреждение о том, что аннотация @Override отсутствует (Java 5 для классов, аннотация поддерживается для интерфейсов в Java 6, но необязательно).

1 голос
/ 06 ноября 2009

Из личного опыта у нас было несколько текстовых полей AWT / Swing, встроенных в рамку SWT_AWT версии 1.5, которые перестали редактироваться после обновления до 1.6.

...