【发布时间】:2015-10-09 23:05:01
【问题描述】:
给定一个具有以下签名的方法。
public static <T extends Comparable<T>> int dummyMethod(List<T> list, T elem) {
// Body
}
以下两种方法中只有第一种编译成功。
public void call() {
MyClass v = new MyClass();
List<MyClass> ls = new ArrayList<>();
dummyMethod(ls, v);
}
public void brokenCall() {
Comparable<MyClass> v = new MyClass();
List<Comparable<MyClass>> ls = new ArrayList<>();
dummyMethod(ls, v); // Compilation error here.
}
javac(JDK 8u60)返回的错误如下:
.\MyClass.java:23: error: method dummyMethod in class MyClass cannot be applied to given types;
dummyMethod(ls, v); // Compilation error here.
^
required: List<T>,T
found: List<Comparable<MyClass>>,Comparable<MyClass>
reason: inference variable T has incompatible bounds
equality constraints: MyClass,Comparable<MyClass>
lower bounds: Comparable<MyClass>
where T is a type-variable:
T extends Comparable<T> declared in method <T>dummyMethod(List<T>,T)
1 error
我很困惑为什么在 brokenCall 中作为参数提供给 dummyMethod 的变量类型与它的签名不匹配。
【问题讨论】: