浅谈泛型程序设计

 

1、为何要使用泛型程序设计java

  一、泛型程序设计:觉得这编写代码能够被不少不一样类型的对象所重用。例如:咱们没必要为了汇集String和File而别设计不一样的类;数组

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

2、定义简单的泛型类spa

  泛型类:就是具备一个或多个类型变量的类。设计

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

  例: 对象

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>{.....}blog

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

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

3、泛型方法:

  例如:

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

 

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

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

4、变量类型的限定

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

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> 

  注意:能够根据需求有多个接口做为限定类,可是限定中至多有一个类。

相关文章
相关标签/搜索