请看下面的代码清单: -
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); //上面代码清单中主要方法的第三个语句
编译好,如果我使用正式类型参数
使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) {
}
}
非常感谢任何理解这一概念的良好解释/参考。
感谢。
答案 0 :(得分:1)
我认为你用一种方式而不是另一种方式获得绑定不匹配的唯一原因是因为它似乎没有参数化SomeClass
的声明,因此使用原始类型。如果您使用原始类型,编译器不会打扰任何通用检查,因此您不会受到任何投诉。
我认为如果您尝试使用Comparable<XParam>
对您的类进行泛化,那么当您尝试使用不正确的绑定调用泛型方法时,您会遇到相同的错误。
对于通用方法,错误是有道理的。
如果你的绑定是T extends Comparable<T>
,并且你传递方法a Comparable<XParam>
,编译器将推断T == Comparable<XParam>
,该方法将查看参数是否扩展Comparable<T> == Comparable<Comparable<XParam>>
。它没有。
我相信如果您使用XParam
类型的参数调用方法XParam extends Comparable<XParam>
,那么您的方法将有效。