浅谈泛型程序设计

 

一、为什么要使用泛型程序设计

  1、泛型程序设计:以为这编写代码可以被很多不同类型的对象所重用。例如:我们不必为了聚集String和File而别设计不同的类;

  2、使代码具有更好的可读性:ArrayList<String> str = new ArrayList<>(); 人们一看就知道是包含了String对象的数组列表;

二、定义简单的泛型类

  泛型类:就是具有一个或多个类型变量的类。

  声明语法:public class  ClassName<T> {...}

  例: 

public class Pair<T> {
  private T first;
  private T second;

  public Pair(){
    first = null;
    second = null;
  }

  public Pair(T frist,T second){
    this.first = first;
    this.second = second;
  }

  public T getFirst(){
    return first;
  }

  public T getSecond(){
    return second;
  }

  public void setFirst(T first){
    this.first = first;
  }

  public void setSecond(T second){
    this.second = second;
  }
}

 

  Pair 类引入了一个类型变量 T ,用 (<>)括起来,并放在类名后边。泛型变量也可以有多个类型变量。例如:public class Pair<T,U>{.....}

  注意:建议类型变量使用大写字母,而且要比较短。泛型类要写在一个单独的文件中。

  用具体的类型替换类型变量就可以实例化泛型类型:Pair<String> pair = new Pair(); 或 Pair pair = new Pair(String,String);

三、泛型方法:

  例如:

class ArrayAlg{
    
    public static <T> T getA (T a){
        //方法体;
    return a; } }

 

  注意:泛型方法既可以在泛型类中定也可以在普通类中定义。类型变量放在修饰符的后边,返回类型的前面。

  方法的调用:String a = ArrayAlg.<String>gerA("hello world");在这种情况下(也是在大多数情况下)编译器有足够的信息能够判断所调用方法的类型,所以方法调用中可以省略<String>类型参数。

四、变量类型的限定

  有时候我们要对类型变量加以约束,看下面的例子:

public class ArrayAlg {
    public static <T> T min(T[] a){
        if(a == null || a.length == 0){
            return null;
        }
        T smallest = a[0];
        for(int i = 1;i < a.length;i++){
            if(smallest.compareTo(a[i]) > 0)  //error The method compareTo(T) is undefined for the type T
                return smallest = a[i];
        }
        return smallest;
    }
}

 

  代码中变量smallest 类型为T ,这意味着它可以是任意一个类的对象。那么问题来了,我们怎么才能确信T所属的类有compareTo方法呢??解决这个问题的方法就是将T限制为实现了Comparable接口的类。可以通过对类型变量T设置限定实现这一点:

  public static <T extends Comparable> T min(T[] a){........}

  现在,泛型方法min只能被实现了Comparable接口的类(如String,LocalDate 等)的数组调用。

  又一个问题出现了,众所周知Comparable是一个接口那么为什么要用关键字extends 而不是 implements呢?

  记法:<T extends BoundingType > 表示T应该是绑定类型的子类型,T和绑定类型都可以是类,也可以是接口。选择关键字extends的原因是更接近于子类的概念。而且java设计者也不打算在语言中再添加一个新关键字了。

  一个类型变量可以有多个限定,限定类型用“&” 分割,而逗号用来分割类型变量。例如:<T extends Comparable & Serializable,U extends String> 

  注意:可以根据需求有多个接口作为限定类,但是限定中至多有一个类。

  

  

 

 

 

  

  

 

posted @ 2017-08-15 12:16  吃素的小飞猪  阅读(2141)  评论(0编辑  收藏  举报