Этот случай, похоже, является еще одним случаем, когда компилятор 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 находится за его пределамиMsgstr ".
FC объявлен для расширения EndoFunctor <?расширяет C, FC>, и предел для FC состоит в том, что он расширяет EndoFunctor для предполагаемого D, который в этом случае является?расширяет C. Я думаю, что javac не понимает, что подстановочный знак представляет один и тот же неизвестный тип в обоих контекстах.Зато Eclipse!
Очевидно, что в javac можно обойти проблему:
interface EndoFunctor< C, FC extends EndoFunctor< ? extends C, FC > > { /*...*/ }
, но это более слабое определение, чем я хочу для этого интерфейса.
Iмог бы также попробовать
interface Algebra< C, D extends C, FC extends EndoFunctor< D, FC > >
, но такой подход заставляет меня везде носить этот дополнительный параметр типа D.
Что делать?