为什么泛型约束T extends Comparable <t>不足以避免强制转换?</t>

时间:2014-12-19 23:25:38

标签: java

我有一个这样的课程:

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)演员似乎很烦恼。我的代码有什么问题吗?

2 个答案:

答案 0 :(得分:4)

因为Comparable<T>.compareTo()的参数类型是T,并且您发送的是一个不兼容的整数。问问自己:如果您知道tempValInteger,为什么要将其声明为T?

答案 1 :(得分:0)

公共抽象类AbstractParameter实现Comparable 会产生编译错误,因为在validatecompareTo调用tempVal并且由于T上没有Upperbound( T可以是任何东西)编译器无法解析方法tempVal.compareTo(...)

你提到过&#34; tempVal将是一个整数&#34;在你的帖子中。因此,请更改类定义以包含此信息,以避免未经检查的警告

public abstract class AbstractParameter<T extends Comparable<Integer>>