Плохое взаимодействие между ссылочными типами и ограниченными символами - PullRequest
3 голосов
/ 30 марта 2012

Этот случай, похоже, является еще одним случаем, когда компилятор 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.

Что делать?

1 Ответ

1 голос
/ 30 марта 2012

Что делать?

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

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

  • Смирись с этим и используй одну из двух альтернатив, которые ты уже нашел, которые "работают".

...