zoukankan      html  css  js  c++  java
  • Java基础(三十)泛型程序(Generic Programming)

      一、泛型程序的定义和使用

      1.为什么要使用泛型程序设计

      泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用。同时,使得程序具有更好的可读性和安全性。

    ArrayList<String> files = new ArrayList<>();

      泛型使用类型参数来指示元素的类型,例如“String”。有两个好处:

    • 当调用get的时候,不需要进行强制类型转换,编译器就知道返回值的类型是String,而不是Object
    String filename = files.get(0);
    • 当调用ArrayList中的add方法时,只能限定传递给add方法的参数的类型是String,这样可以进行检查,避免插入错误类型的对象。例如:
    files.add(new File("..."))

      这样代码是无法通过编译的。但是如果不使用泛型,files就是一个Object类型的对象,那么这条代码是可以通过编译的。

      

      2.定义简单泛型类

    public class Pair<T>        // 类中引用了一个类型变量T
    {
       private T first;         // 指定域的类型
       private T second;
    
       public Pair() { first = null; second = null; }
       public Pair(T first, T second) { this.first = first;  this.second = second; }    // 指定方法参数的类型
    
       public T getFirst() { return first; }               // 指定方法返回参数的类型
       public T getSecond() { return second; }
    
       public void setFirst(T newValue) { first = newValue; }    // 指定方法参数的类型
       public void setSecond(T newValue) { second = newValue; }
    }

      3.在普通类中定义泛型方法

    class ArrayAlg{
        public static <T> T getMiddle(T..a){
            return a[a.length/2];
        }
    }

      当调用一个泛型方法时,在方法名前的尖括号中放入具体的类型:

    String middle = ArrayAlg.<String>getMiddle(" ...","...","...")

      4.类型变量的限定

    class ArrayAlg
    {
       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<>(min, max);
       }
    }

      为了确定T所属的类有compareTo方法,可以将T限制为实现了Comparable接口的类,也就是<T extends Comparable>。一个类型变量或通配符可以有多个限定,用“&”连接即可。

      二、泛型程序的约束和局限性

      1.不能用类型参数代替基本类型。

      例如:不能用Pair<double>,而只能用Pair<Double>

      2.运行时类型查询只适用于原始类型

      如果想要查询一个对象是否属于某个泛型类型时,使用instanceof会得到一个编译器错误,如果使用强制类型转换会得到一个警告。

      虚拟机中的对象总有一个特定的非泛型类型,因此,所有的类型查询只产生原始类型。

    if  (a instanceof Pair<String>)   // 得到一个编译器ERROR
    if (a instanceof Pair<T>) // 得到一个编译器ERROR
    Pair<String> p = (Pair<String>)a; // 得到一个警告,因为测试的只是a是否是任意类型的一个Pair,而无法限定是String

     

  • 相关阅读:
    控件的Visible设为false后,ViewState是否visible?
    协议森林02 小喇叭开始广播 (以太网与WiFi协议)
    Python深入02 上下文管理器
    信号与频谱
    飓风“桑迪”路径图的制作
    谁动了我的奶酪?
    协议森林01 邮差与邮局 (网络协议概观)
    协议森林04 地址耗尽危机 (IPv4与IPv6地址)
    协议森林03 IP接力赛 (IP, ARP, RIP和BGP协议)
    Python补充03 Python内置函数清单
  • 原文地址:https://www.cnblogs.com/BigJunOba/p/9427506.html
Copyright © 2011-2022 走看看