当两个边界均为X时,为什么Java编译器为什么说推理变量具有不兼容的边界,扩展了Comparable <!-?超级X->?

时间:2019-01-04 18:42:41

标签: java generics javac comparable

我遇到了这种极端简化的例子所说明的情况:

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>在什么情况下可能不兼容?有什么办法可以解决这个问题?

0 个答案:

没有答案