来自examlab的通用方法声明

时间:2014-05-17 05:30:23

标签: java generics

abstract class TypeTest<K extends Number> {
    public abstract <K> K useMe(Object k); //OK
    public abstract <K> TypeTest<? extends Number> useMe(TypeTest<? super K> k);  //OK
    public abstract <K> TypeTest<? super Number> useMe(TypeTest<? extends K> k);  //error
    public abstract <V extends K> TypeTest<V> useMe(TypeTest<V> k);  //OK
}
来自ExamLab的回答是上面的声明都没问题,但是我找到了第3个编译错误。我想知道原因,谢谢!

我发现它在Eclipse中很好但在Editplus中使用jdk1.7编译错误,我想确认第3行声明是否正确。

编译错误信息

TypeTest.java:4: 错误: 类型参数? extends K#1不在类型变量K#2的范围内
    public abstract <K> TypeTest<? super Number> useMe(TypeTest<? extends K>
 k);  //error
                                                                ^
  其中, K#1,K#2是类型变量:
    K#1扩展已在方法 <K#1>useMe(TypeTest<? extends K#1>)中声明的Object
    K#2扩展已在类 TypeTest中声明的Number
1 个错误
请按任意键继续. . .

我曾尝试将其编译信息从中文更改为英文,但只能使用凌乱的代码&#34; ??&#34;。谢谢!

1 个答案:

答案 0 :(得分:0)

此答案仅供其他论坛参考:

请注意,方法类型参数与类类型参数不同。方法类型参数隐藏类类型参数。

方法

view plainprint?
Note: Text content in the code blocks is automatically word-wrapped
public abstract <K> TypeTest<? super Number> useMe(TypeTest<? extends K> k);  

将type参数解析为java.lang.Object,因为它是要解析的上限。

但TypeTest还包括不在class参数设置的上限内的那些情况(例如TypeTest),因为类参数TypeTest的类型参数可以是扩展Number的任何东西。

因此编译失败。

请注意,这可以使用JDK版本1.6.0_43或更低版本成功编译,但在JDK版本1.6.0_45或更高版本时失败。

我猜这个问题试图测试的是你是否理解方法类型参数会影响类类型参数。