今天看到了两个这样的写法,非常好奇。
- <T extends Comparable<? super T>>
- public class BplusTree<K extends Comparable </K/>,V>
- 下面是不同人对这种写法的解释 大概理解的意思是实现不同类之间属性的对比
转载链接
这段代码是什么意思呢
public class minStack<T extends Comparable<? super T>> {
Stack<T> data;
Stack<T> min;
T minimum;
int N;
public minStack() {
data = new Stack<T>();
min = new Stack<T>();
N = 0;
}
说明1
- T是java中的泛型这个比较容易理解
- <T extends Comparable>, 这个也是比较常见的写法,T必须实现Comparble接口,而比较类型T也比较容易理解因为一般情况下只有类型相同的才可以比较。
- 问题来了,为什么要实现<T extends Comparable<? super T>>这种方法,看下面的例子。👇
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);
}
}
但如果泛型是<T extends Comparable >显然 Labarador 是不符合的,
因为他并没有实现 comprable</Labrador/>,如果改成<T extends Comparable<? super T>>,那么只要Dog实现了Comparabl接口。Labrador也能用啦。
说明2
从基本的继承实现概念出发:若有:
class Father implements Comparable
以及:class Son extends Father 如果定义Son时:Son 没有implements Comparable那么:对于这种情况:class A <T extends Comparable< T>>new A是非法的,因为Son 没有implements Comparable而对于这种情况:class A <T extends Comparable< ? super T>>new A是合法的,上述表达式中?可以匹配Father,因为Son implements Comparable从上可以看出这种写法的好处是父类若实现了Comparable<父类>,那么即使子类没有实现Comparable<子类>,一样可以new A<子类>
说明3
补充1:java中implements和extends
关键字implements是一个类,实现一个接口用的关键字,它是用来实现接口中定义的抽象方法。实现一个接口,必须实现接口中的所有方法。使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)
还有几点需要注意:
(1)接口可以被多重实现(implements),抽象类只能被单一继承(extends)
(2)接口只有定义,抽象类可以有定义和实现
(3)接口的字段定义默认为:public static final, 抽象类字段默认是”friendly”(本包可见)
补充2:compare__详细用法
一、java中的compareTo():
String s1=“abc”;
String s2=“ace”;
int result=s1.compareTo(s2);
System.out.println(result);
用于比较前后2个字符串的asc码的差值,如果result=0,表示s1=s2; <0表示s1<s2;>0表示s1>s2;
注意:数字类型比较不能用compareTo,直接用 >,<,==,!=比较即可;