我遇到了这种极端简化的例子所说明的情况:
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的行为实际上是a bug,已在Oxygen中修复(我的项目目前在Neon上,这是为什么它仍可以在我正在使用的Eclipse版本中进行编译)。我的问题是,为什么Java编译器拒绝此方法调用? X extends Comparable<? super X>
和Y extends Comparable<? super Y>
在什么情况下可能不兼容?有什么办法可以解决这个问题?