接下来的两行有什么区别?

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>());
    }
}

如果您更改ComparablePerson以便能够比较ObjectPerson(基类的继承树),那么methodX也将起作用。

关于Java通用方法边界,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6883282/

10-09 18:58
查看更多