【发布时间】:2018-01-22 05:58:47
【问题描述】:
准备 OCPJP 6 考试(这就是我使用 Java 1.6 编译器的原因)我注意到一些关于 Java 泛型的不清楚的地方。 考虑以下代码:
class A<K extends Number> {
public <V> V useMe1(A<? super V> a) { // OK
return null;
}
public <V> V useMe2(A<? extends V> a) { // OK
return null;
}
public <V> V useMe3(A<V> a) { // ERROR, but why, since 2 above were ok
return null;
}
}
当我尝试编译代码(使用 1.6 编译器)时,我收到错误:
类型参数 V 不在其范围内
尽管上面的代码无法使用,但我想知道为什么编译器认为 <? super V> 和 <? extends V> 类型与绑定的类类型匹配,但 <V> 不匹配(因为 V 匹配这两个边界)。
我不打算修改该代码,我想了解它。代码取自示例 OCPJP 6 考试题,询问“哪一行将编译?”
【问题讨论】:
-
useMe2不能与 Java 8 一起编译。 -
第二个也不编译:/