通过 T extends Comparable<? super T> 理解泛型边界

public class Animal implements Comparable<Animal>{

        private String name;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        @Override
        public int compareTo(Animal o) {
            // TODO Auto-generated method stub
            return 0;
        }
}

定义一个Animal类,实现Comparable方法

问题1:implements Comparable<Animal> 和implements Comparable  有什么区别

  如果携带类型参数<Animal>那么 就限定了Animal对象只能和Animal对象比较,如果和其他对象比较,在编译阶段就会出错,不携带类型参数<Animal>当然也不会出错,但是Animal对象和其他类型对象比较毫无意义,且容易出错。

编译阶段就能预防错误。。

public class Dog extends Animal{
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

定义一个Dog类,是Animal对象的子类,由于Animal对象已经实现了Comparable接口,因此,Dog类就不能再次实现Comparable<Dog>接口

  编译时出错。。

可以直接使用Animal类的compare(Animal)方法

定义一个通用的排序方法

这三个方法都没问题,但是第三个方法使用了泛型,通常采用

但是第三种方法类型参数T 必须实现Comparable接口,因此Dog类型是不能使用此方法的

如何解决?

 Comparable<? super T> 使用父类方法比较子类型 

这样无论是List<Dog> List<Animal> 都能使用这个方法进行比较,做到了真正的通用性

在非泛型类的泛型方法中,没什么区别

原文地址:https://www.cnblogs.com/lt123/p/8143796.html