2012-03-30 3 views
3

Этот случай, похоже, еще один, где компилятор Java Eclipse разбивает javac. Единственный вопрос для меня - это ошибка в JLS или javac.Плохое взаимодействие между самореферентными типами и ограниченными подстановочными знаками

interface EndoFunctor< C, FC extends EndoFunctor< C, FC > > { /*...*/ } 
interface Algebra< C, FC extends EndoFunctor< ? extends C, FC > > { /*...*/ } 

Вторая строка компилирует в Eclipse, но не удается скомпилировать в JAVAC с сообщением, что «параметр типа FC не входит в его границы».

FC объявлен для расширения EndoFunctor <? расширяет C, FC>, а оценка на FC заключается в том, что она расширяет EndoFunctor < D, FC> для выведенного D, который в этом случае равен? расширяет C. Я думаю, что javac не понимает, что подстановочный знак представляет один и тот же неизвестный тип в обоих контекстах. Eclipse делает, хотя!

Видимо следующий получает вокруг проблемы в JAVAC:

interface EndoFunctor< C, FC extends EndoFunctor< ? extends C, FC > > { /*...*/ } 

, но это определение свободнее, чем я хочу для этого интерфейса.

Я мог бы также попробовать

interface Algebra< C, D extends C, FC extends EndoFunctor< D, FC > > 

но такой подход заставляет меня нести этот дополнительный параметр типа D через везде.

Что делать?

+0

Вы не указали, какую версию javac вы используете. –

+0

Извините. Это java 1.6.0_31. –

ответ

1

Что делать?

Вот пара прагматических решений.

  • javac Попробуйте использовать из последней версии патча от Java 7. Я вспоминаю слух некоторых ошибок Javac компилятора в Java 6, которые были зафиксированы только в Java 7 ... но я не знаю, из списка. (И база данных ошибок Java безнадежно при поиске ...)

  • Положите его и используйте одну из двух альтернатив, которые вы уже нашли, что «работайте».

+0

Да, новый javac (например, openjdk 8) очень хорошо компилирует код OP – charlie