Я столкнулся с ситуацией, которая иллюстрируется этим чрезвычайно упрощенным примером:
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>
могут быть несовместимы друг с другом? Есть ли способ, которым я могу обойти эту проблему?