虽然该账号已经申请很长一段时间,每次找资料,CSDN上的小伙伴所提供的信息总能帮我大忙;时间久了,感觉自己只是一个消费者,并没有做出一点点贡献。最近,脑子一热,买了一个数据结构与算法分析,第一小节看的就是泛型,回头想想,好像大学里学的算法都是以这种泛型方法展示的,废话不多说,自己总结一丢丢。
1.
举个例子:
public class Animal<T>{
private T name;
public T read(){ return name;}
public void write(T name){ this.name = name}
}
public class App{
public static void main(String[] args){
Animal<String> animal = new Animal<String>();
Animal<String> animal01 = new Animal<>(); //此处用了菱形运算符<> ,Java 7 以后才支持
}
当我们传String时,那么 name 就是String类型。
2.类型限定
方法:
public static <T> T findMax(T[] arr){
int maxIndex = 0;
for(int i = 1; i < arr.length; i++){
if( arr[ i ] .compareTo( arr[ maxIndex ]) > 0){
maxIndex = i;
return arr[ maxIndex ];}
该方法意图找出数组的最大值,由于编译器不能证明compareTo方法是合法的,只有在T 是comparable或者comparable的子类才能保证comparaTo存在。因此,我们可以使用类型限定,将函数修改为:
public static <T extends Comparable> T findMax(T[] arr) //虽然Comparable是接口,但也得用extends
即可。
当然我们也可以写成
public static <T extends Comparable<T>> T findMax(T[] arr)
这样我们的compareTo方法比较的就是传入的T这个类型
有个地方我们的注意:
假设 T 为 public class Animal implements Comparable{}
T的子类 public class Dog extends Animal{}
传入Animal , public static<Animal extends Comparable<Animal>> Animal findMax(Animal[] arr) 可行的
但是,传入Dog 是不可行
因为我们知道的只是Dog 实现了Comparable<Animal>,即 Dog IS-A Comparable<Animal>,但它 IS-NOT-A Comparable<Dog>
如果需要使Dog传入可行,方法可改为
public static <Animal extends Comparable<? super Animal>> Animal findMax(Animal[] arr)
希望能对大家有所帮助。