1.泛型变量的类型限定
1.1. 实例
public static <T> T get(T t1,T t2) { if(pareTo(t2) >= 0); // 编译错误 return t1; }
1.2. 因为, 在编译之前, 也就是我们还在定义这个泛型方法的时候, 我们并不知道这个泛型类型T, 到底是什么类型, 所以, 只能默认T为原始类型Object。所以它只能调用来自于Object的那几个方法, 而不能调用compareTo方法。
1.3. 可我的本意就是要比较t1和t2, 怎么办呢? 这个时候, 就要使用类型限定, 对类型变量T设置限定(bound)来做到这一点。我们知道, 所有实现Comparable接口的方法, 都会有compareTo方法。所以, 可以对做如下限定:
public static <T extends Comparable<T>> T get(T t1,T t2) { // 添加类型限定 if(pareTo(t2)>=0); return t1; }
2. 类型限定在泛型类、泛型接口和泛型方法中都可以使用, 不过要注意下面几点:
2.1. 不管该限定是类还是接口, 统一都使用关键字 extends
2.2. 可以使用&符号给出多个限定, 比如:
public static <T extends Comparable<T>&Serializable> T get(T t1,T t2)
2.3. 如果限定既有接口也有类, 那么类必须只有一个, 并且放在首位置:
public static <T extends Object&Comparable&Serializable> T get(T t1,T t2)