接下来的两行有什么区别?
public static <T extends Comparable<? super T>> int methodX(List<T> data)
public static <T> int methodX(List<? extends Comparable<? super T>> data)
最佳答案
您的第一个选择是“严格”参数化。意思是,您要在类T
上定义一堆限制,然后再将其与List
结合使用。在第二种方法中,参数类T
是通用的,没有条件,并且List
的类参数是根据参数T
定义的。
第二种方法在语法上也有所不同,使用?
而不是第一个选项的T
,因为在参数定义中您不是在定义类型参数T
而是使用它,因此第二种方法不能如此具体。
由此产生的实际差异是继承之一。您的第一种方法必须是可与本身的父类(super class)相提并论的类型,而第二种方法仅需要与无条件/不相关的T
相提并论:
public class Person implements Comparable<Number> {
@Override
public int compareTo(Number o) {
return 0;
}
public static <T extends Comparable<? super T>> int methodX(List<T> data) {
return 0;
}
public static <T> int methodY(List<? extends Comparable<? super T>> data) {
return 0;
}
public static void main(String[] args) {
methodX(new ArrayList<Person>()); // stricter ==> compilation error
methodY<Object>(new ArrayList<Person>());
}
}
如果您更改
Comparable
的Person
以便能够比较Object
或Person
(基类的继承树),那么methodX
也将起作用。关于Java通用方法边界,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6883282/