<T extends Comparable<? super T>>的理解

形式

<>意味着java的泛型,而泛型的作用是
1.将运行时错误提前到编译器
2.自动的类型转换

简化版

首先理解一下<T extends Comparable>,这意味着 T 必须实现Comparable接口,而接口的数据类型也要是 T,因为T和T才能进行比较嘛。

<T extends Comparable<? super T>>

如果只有T的父类实现了Comparable接口,而子类也想用这个接口怎么办呢?

class Dog implements Comparable<Dog>{
    int weight;
    public Dog(int weight) {
        this.weight = weight;
    }
    @Override
    public int compareTo(Dog o) {
        return this.weight - o.weight;
    }
}
class Labrador extends Dog{
    public Labrador(int weight) {
        super(weight);
    }
}

作者:菜鸟Arthur
链接:https://www.zhihu.com/question/25548135/answer/171375587
来源:知乎

在这里Labrador 继承了Dog 和他的Comparable方法。但如果泛型是<T extends Comparable >显然 Labarador 是不符合的,因为他并没有实现 Comprable。如果改成<T extends Comparable<? super T>>,那么只要Dog实现了Comparabl接口。Labrador也能用啦。

针对这最后一句要强调的是,如果父类实现了一个接口,那么子类也是实现了这个接口的。以下参考自知乎
从基本的继承实现概念出发:若有:class Father implements Comparable< Father>以及:class Son extends Father则有:Son implements Comparable< Father>(子类自动实现父类所实现的接口)

如果定义Son时:
Son 没有implements Comparable 那么:对于这种情况:class A <T extends Comparable< T>>new A是非法的,因为Son 没有implements Comparable< Son>

而对于这种情况:class A <T extends Comparable< ? super T>>new A< Son>是合法的,上述表达式中?可以匹配Father,因为Son implements Comparable< Father>从上可以看出这种写法的好处是父类若实现了Comparable< 父类>,那么即使子类没有实现Comparable<子类 >,一样可以new A< 子类>

作者:星空
链接:https://www.zhihu.com/question/25548135/answer/491019346
来源:知乎

为什么是extends而不是implements

理论上只有接口才能extends接口,原因见下,总之在泛型中,遇到后面是接口的话,可以将这边的extends看成是实现的意思

参考自 https://blog.csdn.net/Mrsgflmx/article/details/107819929

posted @ 2021-08-25 16:12  Lanezzz  阅读(74)  评论(0)    收藏  举报