`

Java 泛型学习(Java 泛型的理解与等价实现)02

阅读更多

三、泛型的综合运用实例(代码参考java参考大全,有改动)

  1. public class AvgGen<T extends Number> {   
  2.   public AvgGen() {   
  3.   }   
  4.   
  5.   public double getAvg(T[] arr) {   
  6.     double sum = 0.0;   
  7.     for (int i = 0; i < arr.length; i++) {   
  8.       sum = sum + arr[i].doubleValue();   
  9.     }   
  10.     return sum / arr.length;   
  11.   }   
  12.   
  13.   public static void main(String[] args) {   
  14.     // 整形数组求均值   
  15.     System.out.println("整形数组{1, 3}求均值:");   
  16.     Integer[] intArr = { 13 };   
  17.     AvgGen<Integer> intObj = new AvgGen<Integer>();   
  18.     double intavg = intObj.getAvg(intArr);   
  19.     System.out.println(intavg);   
  20.     System.out.println();   
  21.     // 浮点型数组求均值   
  22.     System.out.println("浮点型数组{1.1f,2.9f}求均值:");   
  23.     Float[] fArr = { 1.1f, 2.9f };   
  24.     AvgGen<Float> fObj = new AvgGen<Float>();   
  25.     double favg = fObj.getAvg(fArr);   
  26.     System.out.println(favg);   
  27.   }   
  28. }   
  29.   
  30. /**  
  31.  * Created by IntelliJ IDEA. User: leizhimin Date: 2007-9-18 Time: 11:08:14 使用通配符泛型参数:泛型参数是可变的,可在运行时来确定。  
  32.  */  
  33. public class AvgCompGen<T extends Number> {   
  34.   private T[] arr;   
  35.   
  36.   /**  
  37.    * 构造函数  
  38.    *   
  39.    * @param arr  
  40.    */  
  41.   public AvgCompGen(T[] arr) {   
  42.     this.arr = arr;   
  43.   }   
  44.   
  45.   /**  
  46.    * 求数组均值  
  47.    *   
  48.    * @return 数组均值  
  49.    */  
  50.   public double getAvg() {   
  51.     double sum = 0.0;   
  52.     for (int i = 0; i < arr.length; i++) {   
  53.       sum += arr[i].doubleValue();   
  54.     }   
  55.     return sum / arr.length;   
  56.   }   
  57.   
  58.   /**  
  59.    * 比较数组均值是否相等(使用通配符泛型参数) AvgCompGen<?>表示可以匹配任意的AvgCompGen对象,有点类似Object  
  60.    *   
  61.    * @param x 目标对象  
  62.    * @return 均值是否相等  
  63.    */  
  64.   public boolean sameAvg(AvgCompGen<?> x) {   
  65.     if (getAvg() == x.getAvg())   
  66.       return true;   
  67.     return false;   
  68.   }   
  69.   
  70.   /**  
  71.    * 主函数:用来测试  
  72.    *   
  73.    * @param args  
  74.    */  
  75.   public static void main(String[] args) {   
  76.     // 创建参数为Integer类型泛型对象   
  77.     Integer[] intArr = { 13 };   
  78.     AvgCompGen<Integer> intObj = new AvgCompGen<Integer>(intArr);   
  79.     System.out.println("intObj的平均值=" + intObj.getAvg());   
  80.     // 创建参数为Double类型泛型对象   
  81.     Double[] douArr = { 1.03.0 };   
  82.     AvgCompGen<Double> douObj = new AvgCompGen<Double>(douArr);   
  83.     System.out.println("douObj的平均值=" + douObj.getAvg());   
  84.     // 创建参数为Float类型泛型对象   
  85.     Float[] fltArr = { 0.8f, 3.2f };   
  86.     AvgCompGen<Float> fltObj = new AvgCompGen<Float>(fltArr);   
  87.     System.out.println("fltObj的平均值=" + fltObj.getAvg());   
  88.     // 两两比较对象的均值是否相等   
  89.     if (intObj.sameAvg(douObj))   
  90.       System.out.println("intArr与douArr的值相等,结果为:" + " intObj的均值=" + intObj.getAvg()   
  91.           + "   douObj的均值=" + douObj.getAvg());   
  92.     else  
  93.       System.out.println("intArr与douArr的值不相等,结果为:" + " intObj的均值=" + intObj.getAvg()   
  94.           + "   douObj的均值=" + douObj.getAvg());   
  95.     if (intObj.sameAvg(fltObj))   
  96.       System.out.println("intArr与fltObj的值相等,结果为:" + " intObj的均值=" + intObj.getAvg()   
  97.           + "   fltObj的均值=" + fltObj.getAvg());   
  98.     else  
  99.       System.out.println("intArr与fltObj的值不相等,结果为:" + " intObj的均值=" + intObj.getAvg()   
  100.           + "   fltObj的均值=" + fltObj.getAvg());   
  101.     if (douObj.sameAvg(fltObj))   
  102.       System.out.println("douObj与fltObj的值相等,结果为:" + " douObj的均值=" + intObj.getAvg()   
  103.           + "   fltObj的均值=" + fltObj.getAvg());   
  104.     else  
  105.       System.out.println("douObj与fltObj的值不相等,结果为:" + " douObj的均值=" + intObj.getAvg()   
  106.           + "   fltObj的均值=" + fltObj.getAvg());   
  107.   }   
  108. }   
  109.   
  110. /**  
  111.  * Created by IntelliJ IDEA. User: leizhimin Date: 2007-9-18 Time: 16:09:37 三种坐标,用泛型实现坐标打印  
  112.  */  
  113. public class TwoD {   
  114.   int x, y;   
  115.   
  116.   public TwoD(int x, int y) {   
  117.     this.x = x;   
  118.     this.y = y;   
  119.   }   
  120. }   
  121.   
  122. class ThreeD extends TwoD {   
  123.   int z;   
  124.   
  125.   public ThreeD(int x, int y, int z) {   
  126.     super(x, y);   
  127.     this.z = z;   
  128.   }   
  129. }   
  130.   
  131. class FourD extends ThreeD {   
  132.   int t;   
  133.   
  134.   public FourD(int x, int y, int z, int t) {   
  135.     super(x, y, z);   
  136.     this.t = t;   
  137.   }   
  138. }   
  139.   
  140. /**  
  141.  * 存放泛型坐标的(数据结构)类  
  142.  */  
  143. class Coords<T extends TwoD> {   
  144.   T[] coords;   
  145.   
  146.   public Coords(T[] coords) {   
  147.     this.coords = coords;   
  148.   }   
  149. }   
  150.   
  151. /**  
  152.  * 工具类--打印泛型数据 并给出一个测试方法  
  153.  */  
  154. class BoundeWildcard {   
  155.   static void showXY(Coords<?> c) {   
  156.     System.out.println("X Y Coordinates:");   
  157.     for (int i = 0; i < c.coords.length; i++) {   
  158.       System.out.println(c.coords[i].x + "  " + c.coords[i].y);   
  159.     }   
  160.     System.out.println();   
  161.   }   
  162.   
  163.   static void showXYZ(Coords<? extends ThreeD> c) {   
  164.     System.out.println("X Y Z Coordinates:");   
  165.     for (int i = 0; i < c.coords.length; i++) {   
  166.       System.out.println(c.coords[i].x + "  " + c.coords[i].y + "  " + c.coords[i].z);   
  167.     }   
  168.     System.out.println();   
  169.   }   
  170.   
  171.   static void showAll(Coords<? extends FourD> c) {   
  172.     System.out.println("X Y Z Coordinates:");   
  173.     for (int i = 0; i < c.coords.length; i++) {   
  174.       System.out.println(c.coords[i].x + "  " + c.coords[i].y + "  " + c.coords[i].z + "  "  
  175.           + c.coords[i].t);   
  176.     }   
  177.     System.out.println();   
  178.   }   
  179.   
  180.   public static void main(String args[]) {   
  181.     TwoD td[] = { new TwoD(00), new TwoD(79), new TwoD(184), new TwoD(-1, -23) };   
  182.     Coords<TwoD> tdlocs = new Coords<TwoD>(td);   
  183.     System.out.println("Contents of tdlocs.");   
  184.     showXY(tdlocs);   
  185.     FourD fd[] = { new FourD(1234), new FourD(68148), new FourD(22949),   
  186.         new FourD(3, -2, -2317) };   
  187.     Coords<FourD> fdlocs = new Coords<FourD>(fd);   
  188.     System.out.println("Contents of fdlocs.");   
  189.     showXY(fdlocs);   
  190.     showXYZ(fdlocs);   
  191.     showAll(fdlocs);   
  192.   }   
  193. }  
public class AvgGen<T extends Number> {
  public AvgGen() {
  }

  public double getAvg(T[] arr) {
    double sum = 0.0;
    for (int i = 0; i < arr.length; i++) {
      sum = sum + arr[i].doubleValue();
    }
    return sum / arr.length;
  }

  public static void main(String[] args) {
    // 整形数组求均值
    System.out.println("整形数组{1, 3}求均值:");
    Integer[] intArr = { 1, 3 };
    AvgGen<Integer> intObj = new AvgGen<Integer>();
    double intavg = intObj.getAvg(intArr);
    System.out.println(intavg);
    System.out.println();
    // 浮点型数组求均值
    System.out.println("浮点型数组{1.1f,2.9f}求均值:");
    Float[] fArr = { 1.1f, 2.9f };
    AvgGen<Float> fObj = new AvgGen<Float>();
    double favg = fObj.getAvg(fArr);
    System.out.println(favg);
  }
}

/**
 * Created by IntelliJ IDEA. User: leizhimin Date: 2007-9-18 Time: 11:08:14 使用通配符泛型参数:泛型参数是可变的,可在运行时来确定。
 */
public class AvgCompGen<T extends Number> {
  private T[] arr;

  /**
   * 构造函数
   * 
   * @param arr
   */
  public AvgCompGen(T[] arr) {
    this.arr = arr;
  }

  /**
   * 求数组均值
   * 
   * @return 数组均值
   */
  public double getAvg() {
    double sum = 0.0;
    for (int i = 0; i < arr.length; i++) {
      sum += arr[i].doubleValue();
    }
    return sum / arr.length;
  }

  /**
   * 比较数组均值是否相等(使用通配符泛型参数) AvgCompGen<?>表示可以匹配任意的AvgCompGen对象,有点类似Object
   * 
   * @param x 目标对象
   * @return 均值是否相等
   */
  public boolean sameAvg(AvgCompGen<?> x) {
    if (getAvg() == x.getAvg())
      return true;
    return false;
  }

  /**
   * 主函数:用来测试
   * 
   * @param args
   */
  public static void main(String[] args) {
    // 创建参数为Integer类型泛型对象
    Integer[] intArr = { 1, 3 };
    AvgCompGen<Integer> intObj = new AvgCompGen<Integer>(intArr);
    System.out.println("intObj的平均值=" + intObj.getAvg());
    // 创建参数为Double类型泛型对象
    Double[] douArr = { 1.0, 3.0 };
    AvgCompGen<Double> douObj = new AvgCompGen<Double>(douArr);
    System.out.println("douObj的平均值=" + douObj.getAvg());
    // 创建参数为Float类型泛型对象
    Float[] fltArr = { 0.8f, 3.2f };
    AvgCompGen<Float> fltObj = new AvgCompGen<Float>(fltArr);
    System.out.println("fltObj的平均值=" + fltObj.getAvg());
    // 两两比较对象的均值是否相等
    if (intObj.sameAvg(douObj))
      System.out.println("intArr与douArr的值相等,结果为:" + " intObj的均值=" + intObj.getAvg()
          + "   douObj的均值=" + douObj.getAvg());
    else
      System.out.println("intArr与douArr的值不相等,结果为:" + " intObj的均值=" + intObj.getAvg()
          + "   douObj的均值=" + douObj.getAvg());
    if (intObj.sameAvg(fltObj))
      System.out.println("intArr与fltObj的值相等,结果为:" + " intObj的均值=" + intObj.getAvg()
          + "   fltObj的均值=" + fltObj.getAvg());
    else
      System.out.println("intArr与fltObj的值不相等,结果为:" + " intObj的均值=" + intObj.getAvg()
          + "   fltObj的均值=" + fltObj.getAvg());
    if (douObj.sameAvg(fltObj))
      System.out.println("douObj与fltObj的值相等,结果为:" + " douObj的均值=" + intObj.getAvg()
          + "   fltObj的均值=" + fltObj.getAvg());
    else
      System.out.println("douObj与fltObj的值不相等,结果为:" + " douObj的均值=" + intObj.getAvg()
          + "   fltObj的均值=" + fltObj.getAvg());
  }
}

/**
 * Created by IntelliJ IDEA. User: leizhimin Date: 2007-9-18 Time: 16:09:37 三种坐标,用泛型实现坐标打印
 */
public class TwoD {
  int x, y;

  public TwoD(int x, int y) {
    this.x = x;
    this.y = y;
  }
}

class ThreeD extends TwoD {
  int z;

  public ThreeD(int x, int y, int z) {
    super(x, y);
    this.z = z;
  }
}

class FourD extends ThreeD {
  int t;

  public FourD(int x, int y, int z, int t) {
    super(x, y, z);
    this.t = t;
  }
}

/**
 * 存放泛型坐标的(数据结构)类
 */
class Coords<T extends TwoD> {
  T[] coords;

  public Coords(T[] coords) {
    this.coords = coords;
  }
}

/**
 * 工具类--打印泛型数据 并给出一个测试方法
 */
class BoundeWildcard {
  static void showXY(Coords<?> c) {
    System.out.println("X Y Coordinates:");
    for (int i = 0; i < c.coords.length; i++) {
      System.out.println(c.coords[i].x + "  " + c.coords[i].y);
    }
    System.out.println();
  }

  static void showXYZ(Coords<? extends ThreeD> c) {
    System.out.println("X Y Z Coordinates:");
    for (int i = 0; i < c.coords.length; i++) {
      System.out.println(c.coords[i].x + "  " + c.coords[i].y + "  " + c.coords[i].z);
    }
    System.out.println();
  }

  static void showAll(Coords<? extends FourD> c) {
    System.out.println("X Y Z Coordinates:");
    for (int i = 0; i < c.coords.length; i++) {
      System.out.println(c.coords[i].x + "  " + c.coords[i].y + "  " + c.coords[i].z + "  "
          + c.coords[i].t);
    }
    System.out.println();
  }

  public static void main(String args[]) {
    TwoD td[] = { new TwoD(0, 0), new TwoD(7, 9), new TwoD(18, 4), new TwoD(-1, -23) };
    Coords<TwoD> tdlocs = new Coords<TwoD>(td);
    System.out.println("Contents of tdlocs.");
    showXY(tdlocs);
    FourD fd[] = { new FourD(1, 2, 3, 4), new FourD(6, 8, 14, 8), new FourD(22, 9, 4, 9),
        new FourD(3, -2, -23, 17) };
    Coords<FourD> fdlocs = new Coords<FourD>(fd);
    System.out.println("Contents of fdlocs.");
    showXY(fdlocs);
    showXYZ(fdlocs);
    showAll(fdlocs);
  }
}
原文请见: http://www.java2000.net/p7927
                 http://www.java2000.net/p7926



注意:多个泛型类、接口,接口、类继承,这种设计方式往往会导致泛型很复杂,程序的可读性急剧下降,程序中应该兼顾代码的可读性。

总结:
泛型其实就是一个类型的参数化,没有它程序照样写!把这句话记心里。有两层含义:一是泛型的实质,二是要知其然还要知其所以然。泛型不可怕,泛型的设计也从开发者角度出发的,使用得当会大大提高代码的安全性和简洁性。

分享到:
评论

相关推荐

    Java泛型的理解与等价实现

    本文将深入探讨Java泛型的概念、使用方式以及等价的非泛型实现,帮助读者全面理解这一强大的工具。 首先,泛型允许在类、接口和方法中定义类型参数,使得代码能够在编译时进行类型检查,防止了运行时可能出现的...

    Java泛型的理解与等价实现.docx

    Java泛型是编程语言中的一个重要概念,首次引入于Java SE 1.5版本,它允许开发者在类、接口和方法中定义类型参数,从而增强了代码的类型安全性、可读性和可重用性。泛型的基本思想是参数化类型,这意味着在编程时...

    jdk5.zip_java 泛型_jdk5 泛型_泛型

    Java泛型在运行时会被擦除,因此泛型不提供运行时的类型检查。所有的泛型类和方法都会有一个没有泛型的等价形式,这个过程称为类型擦除。 4. **通配符的使用**: - 无界通配符:`?`,表示类型参数可以是任何类型...

    Java泛型文章原代码

    Java泛型是Java编程语言中的一...通过深入理解和熟练运用Java泛型,开发者可以编写出更健壮、类型安全的代码,减少潜在的运行时异常,并提高代码的可维护性和复用性。在实际项目中,合理使用泛型可以显著提高代码质量。

    Java泛型枚举与For语句的简化写法PPT教案学习.pptx

    "Java泛型枚举与For语句的简化写法PPT教案学习" 以下是根据给定的文件信息生成的相关知识点: 一、泛型枚举 泛型枚举是Java中的一种枚举类型,它允许在枚举类型中定义泛型参数。泛型枚举可以使枚举类型更加灵活和...

    Java5.0泛型编程

    Java5.0泛型编程是Java开发中的一个重要里程碑,它引入了一种强大的类型系统机制,大大增强...理解和熟练运用泛型是每个Java开发者必备的技能。通过深入学习和实践,开发者可以编写出更加高效、安全且易于维护的代码。

    Java利用接口实现回调

    在Java支持方法指针之前,Java接口不能提供一种实现回调的好方法。如果您习惯于传递在事件驱动编程模型中调用的函数指针,则您会喜欢本技巧。  熟悉MS-Windows和X Window System事件驱动编程模型的开发人员,习惯...

    Java语言程序设计:ch05 泛型、枚举与for语句的简化写法.ppt

    Java 语言程序设计中的泛型、枚举与 for 语句的简化写法 泛型(Genericity)是一种编程语言机制,允许开发者编写更加通用的代码,从而提高代码的复用性和效率。Java 语言程序设计中,泛型的应用可以分为两种:泛型...

    Java程序设计:第五章 泛型、枚举与for语句的简化写法.ppt

    Java程序设计第五章 泛型、枚举与for语句的简化写法 Java 程序设计中,泛型(Genericity)是一种强大且灵活的编程技术,它可以减少数据的类型转换,并避免程序类型转换错误,并提高程序代码的复用性和运行效率。...

    深入Java:Generics泛型

    泛型是Java编程语言中的一个重要特性,它允许程序员在定义类、接口以及方法时使用类型参数,从而提高代码的重用性和安全性。泛型的主要目标是实现类型...因此,深入理解和掌握Java泛型是每个Java开发者必备的技能之一。

    C++,java互转

    转换C++到Java的过程中,主要关注点在于理解C++的语法特性和数据结构,然后将其映射到Java的等价概念上。例如,C++中的指针需要转换为Java的引用,C++的多态通常通过虚函数实现,而在Java中则利用接口和继承。此外,...

    java学习笔记(自己整理的)

    【Java学习笔记】这篇笔记涵盖了Java编程的基础知识,包括数据类型、字符串操作、内存管理、类和对象、构造函数、包、访问权限、...这些笔记内容是Java学习的基石,理解和掌握这些知识点对于深入学习Java编程至关重要。

    C++ for Java Programmers.rar

    C++还引入了模板,这是一种泛型编程技术,可以在编译时生成特定类型的函数和类,而Java的泛型是在运行时实现的。 其次,C++提供了指针的概念,这是Java中没有的。指针允许直接操作内存,进行高效的数据处理和低级...

    面向对象编程:C++与Java比较教程 英文版

    第9章讲解了函数和方法的区别与联系,函数是C++中的概念,而方法则是Java中的等价概念。 第10章讲述了异常处理机制,这是编写健壮、错误可控程序的关键技术。 第11章继续深入探讨类的概念,并介绍了C++和Java中类...

    Java各种类型转换md,学习代码

    这意味着在运行时,泛型对象和非泛型对象是等价的,因此需要特别注意类型安全。 7. Lambda表达式与函数式接口 Java 8引入了Lambda表达式,它们可以隐式转换为函数式接口的实例。函数式接口只包含一个抽象方法,如...

    腾讯校招Java、测试工程师笔试题

    2. 测试用例设计:学习如何编写有效的测试用例,包括等价类划分、边界值分析等方法。 3. 缺陷管理:了解缺陷跟踪系统的使用,如JIRA,以及缺陷报告的标准格式。 4. 自动化测试:掌握Selenium、JUnit等自动化测试工具...

    Thinking in java4(中文高清版)-java的'圣经'

    读者评论 前言 简介 第1章 对象导论 1.1 抽象过程 1.2 每个对象都有一个接口 1.3 每个对象都提供服务 1.4 被隐藏的具体实现 1.5 复用具体实现 1.6 继承 1.6.1 “是一个”(is-a)与“像是一个”(is-like-a)关系 ...

    C# to Java Converter.zip

    7. 多线程:C#的线程与Java的线程在API上有所不同,转换时需要关注线程同步和并发控制的实现。 8. 静态类和方法:C#中的静态类在Java中没有直接对应的概念,可能需要转换为普通类,所有成员都是静态的。 9. 注解:...

    Effective-Java读书笔记

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,它提供了许多实用的编程指导原则,帮助开发者写出更高效、更可维护的代码。...通过深入学习和实践,开发者可以极大地提升其Java编程的水平。

    thinkingInJava15:泛型

    "Thinking in Java"是一本经典的Java学习书籍,其第15章深入探讨了泛型的各个方面。在"thinkingInJava15-master"这个压缩包文件中,很可能包含了与泛型相关的源代码示例和讲解。 1. **泛型的基本概念**: 泛型是在...

Global site tag (gtag.js) - Google Analytics