Этот случай, похоже, еще один, где компилятор 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 через везде.
Что делать?
Вы не указали, какую версию javac вы используете. –
Извините. Это java 1.6.0_31. –