天天看点

数据结构之java泛型

        虽然该账号已经申请很长一段时间,每次找资料,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)

希望能对大家有所帮助。

继续阅读