我有一个这样的课程:
public class AbstractParameter<T extends Comparable> {
....
public void validate(T tempVal, StringBuilder msg) {
if(tempVal.compareTo(new Integer(0)) != 0 ) {
//do something
}
}
....
}
tempVal将是一个整数。它编译并运行良好。但是,如果我将 T extends Comparable 更改为 T extends Comparable<T>
以上if语句生成以下编译错误:
required: T#1
found: Integer
reason: actual argument Integer cannot be converted to T#1 by method invocation conversion
where T#1,T#2 are type-variables:
T#1 extends Comparable<T#1> declared in class AbstractParameter
T#2 extends Object declared in interface Comparable
我可以将 new Integer(0)强制转换为 T 以删除编译错误。我的问题是我应该使用public class AbstractParameter<T extends Comparable>
还是public class AbstractParameter<T extends Comparable<T>>
?
我想public class AbstractParameter<T extends Comparable<T>>
应该是要走的路,但(T)new Integer(0)
演员似乎很烦恼。我的代码有什么问题吗?
答案 0 :(得分:4)
因为Comparable<T>.compareTo()
的参数类型是T,并且您发送的是一个不兼容的整数。问问自己:如果您知道tempVal
是Integer
,为什么要将其声明为T?
答案 1 :(得分:0)
公共抽象类AbstractParameter实现Comparable 会产生编译错误,因为在validate
内compareTo
调用tempVal
并且由于T上没有Upperbound( T可以是任何东西)编译器无法解析方法tempVal.compareTo(...)
你提到过&#34; tempVal将是一个整数&#34;在你的帖子中。因此,请更改类定义以包含此信息,以避免未经检查的警告
public abstract class AbstractParameter<T extends Comparable<Integer>>