zoukankan      html  css  js  c++  java
  • 浅谈泛型程序设计

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

      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> 

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

      

      

      

      

  • 相关阅读:
    【repost】JavaScript 运行机制详解:再谈Event Loop
    【repost】学JS必看-JavaScript数据结构深度剖析
    【repost】JavaScript 基本语法
    【repost】前端学习总结(二十三)——前端框架天下三分:Angular React 和 Vue的比较
    【repost】jQuery笔记总结
    【repost】javascript:;与javascript:void(0)使用介绍
    jQuery对象与DOM对象之间的转换方法
    EBS_DBA_问题:主键insert引起的死锁
    BI_开发_问题:ORA-26002: Table DWH.W_XACT_TYPE_D has index defined upon it.
    BI_开发_问题:到target库中的字符为?
  • 原文地址:https://www.cnblogs.com/yuanyongbin/p/7361507.html
Copyright © 2011-2022 走看看