[英]Bound mismatch warning in java generics
请看下面的代码清单:
package com.test;
class XParam implements Comparable<XParam>{
@Override
public int compareTo(XParam o) {
// TODO Auto-generated method stub
return 0;
}
}
public class Main {
public static void main(String[] args) {
Comparable<XParam> param = new XParam() ;
SomeClass object = new SomeClass() ;
object.setData( param );
}
}
现在,
object.setData(param); //以上代码清单中main方法中的第三条语句
如果我使带有正式类型参数的SomeClass泛型,编译效果很好
<T extends Comparable<T>>
如下所示 :-
class SomeClass<T extends Comparable<T>>{
public void setData(T data) {
}
}
但是, object.setData(param); 在Eclipse中给出以下编译时错误:-
Bound mismatch: The generic method setData(T) of type SomeClass is not applicable for the
arguments (Comparable<XParam>). The inferred type Comparable<XParam> is not a valid
substitute for the bounded parameter <T extends Comparable<T>>
如果我在方法级别应用相同的形式类型参数,而不是在类级别添加它,如下所示:
class SomeClass{
public <T extends Comparable<T>>void setData(T data) {
}
}
任何理解该概念的良好解释/参考都将受到高度赞赏。
谢谢。
我认为唯一一种原因是绑定不匹配,而另一种则不是,这似乎不是因为您在参数化SomeClass
的声明而使用了原始类型。 如果使用原始类型,则编译器不会打扰任何常规检查,因此您不会有任何抱怨。
我认为,如果您尝试使用Comparable<XParam>
通用化您的类,则会收到与尝试以不正确的界限调用通用方法时得到的相同错误。
对于通用方法,该错误是有道理的。
如果边界是T extends Comparable<T>
,并且将方法传递给Comparable<XParam>
,则编译器将推断T == Comparable<XParam>
,该方法将查看参数是否扩展了Comparable<T> == Comparable<Comparable<XParam>>
。 没有。
我相信 ,如果使用XParam
类型的参数调用该方法,则该方法将起作用,因为XParam extends Comparable<XParam>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.