• Java面向对象程序设计--泛型编程


    1. 为何要进行泛型编程?

    泛型变成为不同类型集合提供相同的代码!省去了为不同类型而设计不同代码的麻烦!

    2. 一个简单泛型类的定义:


     1 public class PairTest1 
     2 {
     3     public static void main(String[] args) 
     4     {
     5         String[] arr = {"This","is","the","end","of","the","world"};
     6         Pair<String> mm = ArrayAlg.minmax(arr);
     7         System.out.println("min = " + mm.getFirst());
     8         System.out.println("max = " + mm.getSecond());
     9     }
    10 }
    11 
    12 class Pair<T>
    13 {
    14     public Pair() {first = null; second = null;}
    15     public Pair(T first,T second) {this.first = first; this.second = second;}
    16     
    17     public T getFirst() {return first;}
    18     public T getSecond() {return second;}
    19 
    20     public void setFirst(T newValue) {this.first = newValue;}
    21     public void setSecond(T newValue) {this.second = newValue;}
    22     
    23     private T first;
    24     private T second;
    25 }
    26 
    27 class ArrayAlg
    28 {
    29     public static Pair<String> minmax(String[] a)
    30     {
    31         if(a == null || a.length == 0) return null;
    32         String min = a[0];
    33         String max = a[0];
    34         for(int i = 1; i < a.length; i++)
    35         {
    36             if(min.compareTo(a[i]) > 0) min = a[i];
    37             if(max.compareTo(a[i]) < 0) max = a[i];
    38         }
    39         return new Pair<String>(min,max);
    40     }
    41 }

    上面这段代码中定义了一个泛型类。

    2. 泛型函数:

    下面是一个泛型函数定义的实例:

    1 class ArrayAlg
    2 {    
    3     public static <T> T getMiddle(T[] a)
    4     {
    5         return a[a.length / 2];
    6     }
    7 }

    注意,一个泛型函数可以定义在一个普通类中,也可以定义在一个泛型类中。

     注意在上述模板函数的定义中,模板参数变量的位置,是出现在public static 修饰符之后的!

    下面是模板函数的调用:

            String[] arr = {"this","is","me"};
            String middle = ArrayAlg.<String>getMiddle(arr);
            System.out.println(middle);

    在实际中,调用泛型函数时并不需要在函数前加上<String>操作符。java会自动进行类型检查,比如上面getMiddle会自动检查出参数arr的类型是String[]的,这样推测出

    T的类型是String。

    3. 类型变量的约束:

    public static <T extends Comparable> Pair<T> minmax(T[] a)
        {
            if(a == null || a.length == 0) return null;
            T min = a[0];
            T max = a[0];
            for(int i = 1; i < a.length; i++)
            {
                if(min.compareTo(a[i]) > 0) min = a[i];
                if(max.compareTo(a[i]) < 0) max = a[i];
            }
            return new Pair<T>(min,max);
        }

    这里为类型变量T添加了约束T extends Comparable,要求T实现Comarable接口中的CompareTo函数!

    Java中泛型变量的约束条件是: <T extends BoundingType>, 你可以让T继承一个类,或者继承任意一个接口,或者同时继承一个类和一个接口,但无论如何

    不能继承多个类!

    4.泛型代码和虚拟机之间的关系:

    虚拟机中没有泛型类型的对象,所有的对象都是具体的类型的对象。

    当定义了一个泛型类型之后,编译器会自动提供一个相对应的原始类型(raw type):

    raw type的类型名和泛型类型名相同,只是泛型类型参数被去掉了。类型变量被替换成成限定类型对象或Object类型对象。

     1 class Pair<T>
     2 {
     3     public Pair() {first = null; second = null;}
     4     public Pair(T first,T second) {this.first = first; this.second = second;}
     5     
     6     public T getFirst() {return first;}
     7     public T getSecond() {return second;}
     8 
     9     public void setFirst(T newValue) {this.first = newValue;}
    10     public void setSecond(T newValue) {this.second = newValue;}
    11     
    12     private T first;
    13     private T second;
    14 }

    上面的类型对应的原始类型是:

    class Pair<T>
    {
        public Pair() {first = null; second = null;}
        public Pair(Object first,Object second) {this.first = first; this.second = second;}
        
        public Object getFirst() {return first;}
        public Object getSecond() {return second;}
    
        public void setFirst(Object newValue) {this.first = newValue;}
        public void setSecond(Object newValue) {this.second = newValue;}
        
        private Object first;
        private Object second;
    }

      




  • 相关阅读:
    Linux Kernel 2:用户空间的初始化
    Linux Kernel系列一:开篇和Kernel启动概要
    谢宝友:会说话的Linux内核
    如何给USB移动硬盘格式化分区
    AVR单片机最小系统 基本硬件线路与分析
    Altium Designer 基本封装
    AVR单片机命名规则
    LynxFly科研小四轴横空出世,开源,F4,WIFI --(转)
    四轴自适应控制算法的一些尝试开源我的山猫飞控和梯度在线辨识自适应等算法—(转)
    我的四轴专用PID参数整定方法及原理---超长文慎入(转)
  • 原文地址:https://www.cnblogs.com/jiangheng/p/3761865.html
Copyright © 2020-2023  润新知