Существует ли фрагмент программы на Java, который может компилироваться с компилятором Java 5 на JRE 6, но не компилятор Java 6? - PullRequest
11 голосов
/ 19 ноября 2009

Я хочу, чтобы исходный файл мог компилироваться с javac / ecj, установленным на Java 5, но не на Java 6 (даже если базовая среда выполнения Java - Java 6).

Это необходимо для того, чтобы быть уверенным, что уровень компилятора установлен правильно в Eclipse 3.5, работающем с установленной Java 6, но где результат должен выполняться на установке Java 5.

Для Java 1.4 я мог бы использовать «enum» в качестве имени переменной (что не работает в Java 5 и более поздних версиях), но я не могу найти подобный подход для Java 5 против 6 (и более поздних).

Предложения

Ответы [ 3 ]

14 голосов
/ 19 ноября 2009

Нет ничего в языке Java , который был удален между JDK5 и 6. Единственное, что было добавлено, как уже было сказано, это аннотация @Override, допустимая для методы интерфейса - без ключевых слов. Поэтому, боюсь, у вас остаются различия в библиотеках как единственная причина, по которой вы можете вносить изменения.

Они существуют даже в основном API; в необычном порыве разгрома обратной совместимости они изменили сигнатуру некоторых методов в интерфейсе ExecutorService. Это было потому, что общие сигнатуры методов были чрезмерно ограничительными. Это было чистое изменение библиотеки (хотя, будучи частью java.util, симпатичной базовой библиотеки ); ничего общего с модификацией на уровне языка.

Например, из JDK5 :

<T> T invokeAny(Collection<Callable<T>> tasks)

до JDK6 :

<T> T invokeAny(Collection<? extends Callable<T>> tasks)

Это означает, что любая программа, содержащая код , реализующий этот интерфейс в JDK5, не скомпилировалась бы с JDK6. Фрагмент легко создать; просто позвольте вашей IDE создать пустую реализацию интерфейса JDK5, а затем выполнить сборку с использованием JDK6.

Примечание: , что подстановочный знак был добавлен, потому что предыдущая версия не приняла бы параметр, подобный List<MyCallable<String>> (то есть коллекция, набираемая некоторым подклассом вызываемого), тогда как более поздняя версия делает. *

2 голосов
/ 19 ноября 2009

Поскольку JVMDI был удален и JVMPI был отключен в Java SE 6 (согласно Замечания к выпуску J2SE 6.0 ), вы можете добавить код с помощью этого API: он не будет компилироваться с J2SE 6.0, только 5.0. (как показано на этой теме )

0 голосов
/ 19 ноября 2009

Не ответ на ваш вопрос, а альтернатива вашему подходу: не будет ли возможно использовать второй компоновщик, основанный на ant или maven, который вы используете по требованию для создания конечного приложения или библиотеки? Эта сборка будет использовать реальный внешний Java 5 SDK и, таким образом, будет гарантировать, что приложение / библиотека будет работать в среде Java5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...