【发布时间】:2014-03-09 08:23:37
【问题描述】:
这个方法声明有什么问题?
public abstract class A<K extends Number>{
public abstract <K> A<K> useMe (A<K> k);
}
我看到编译错误:
java: type argument K is not within bounds of type-variable K
我对这个编译错误的第一个想法是 - 在我的方法声明中不能保证 K 是数字,这就是问题出现的原因。
但另一种情况如下:
public abstract <K> A<? extends Number> useMe (A<? super K> k);
A<? super K> 再次不能保证它是数字(但是 IDE 标志警告)但它不是编译错误。
有什么区别?
【问题讨论】:
-
这对我来说也是相当令人惊讶的。我希望该签名会失败。仅供参考,如果我将
A<? super K>更改为A<? super Object>,其中Object是K的擦除,则编译失败。寻找一些可以很好解释的答案。 -
但是我的 IDE 说是编译错误,但是手动完成后我没有看到编译错误
-
@RohitJain 您使用的是哪个编译器?
A<? super Object>作为参数类型对我来说使用源级别为 1.7 和 1.8 的 javac 和 Eclipse 编译器编译得很好。 -
@ErwinBolwidt 在 JDK 1.8.0 - build 129 下对我不起作用。在源代码级别为 1.8 的 Eclipse 中也没有
-
@gstackoverflow 似乎我的概念推导有点错误。这是same question posted on SO,其中提到Java 可能不使用下界通配符进行边界检查。你可能想看看。