Почему компилятор Java говорит, что переменная логического вывода имеет несовместимые границы, когда обе границы X расширяются Comparable <? супер х>? - PullRequest
0 голосов
/ 04 января 2019

Я столкнулся с ситуацией, которая иллюстрируется этим чрезвычайно упрощенным примером:

static class ComparableContainer<T extends Comparable<? super T>> {
  T comparableValue;
}

static void processComparableContainer(ComparableContainer<?> container) {
  System.out.println(getComparableValue(container));
}

static <U extends Comparable<? super U>> U getComparableValue(ComparableContainer<U> container) {
  return container.comparableValue;
}

Основная ситуация заключается в том, что, учитывая класс с параметром универсального типа T extends Comparable<? super T>, мне нужно передать экземпляр с неизвестным T в метод, параметризованный с одинаковыми границами. Интересно, что версия Eclipse, в которой я изначально написал код, компилирует и выполняет его без каких-либо проблем, но javac сообщает о следующей ошибке:

SimpleExample.java:7: error: method getComparableValue in class SimpleExample cannot be applied to given types;
    System.out.println(getComparableValue(container));
                       ^
  required: ComparableContainer<U>
  found: ComparableContainer<CAP#1>
  reason: inference variable U has incompatible bounds
    equality constraints: CAP#1
    upper bounds: Comparable<? super U>
  where U is a type-variable:
    U extends Comparable<? super U> declared in method <U>getComparableValue(ComparableContainer<U>)
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Comparable<? super CAP#1> from capture of ?
1 error

Из того, что я могу сказать, основываясь на ответах на this и другие вопросы, поведение Eclipse на самом деле ошибка , которая была исправлена ​​в Oxygen (мой проект в настоящее время на Neon, поэтому он все еще компилируется в той версии Eclipse, которую я использую). Мой вопрос: почему компилятор Java отклоняет этот вызов метода? При каких обстоятельствах X extends Comparable<? super X> и Y extends Comparable<? super Y> могут быть несовместимы друг с другом? Есть ли способ, которым я могу обойти эту проблему?

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