• Java中泛型在集合框架中的应用


      泛型是Java中的一个重要概念,上一篇文章我们说过,当元素存入集合时,集合会将元素转换为Object类型存储,当取出时也是按照Object取出的,所以用get方法取出时,我们会进行强制类型转换,并且通过代码也可以看出来,我们放入其他类型时,如字符串,编译器不会报错,但是运行程序时会抛出类型错误异常,这样给开发带来很多不方便,用泛型就解决了这个麻烦

      泛型规定了某个集合只能存放特定类型的属性,当添加类型与规定不一致时,编译器会直接报错,可以清楚的看到错误

      当我们从List中取出元素时直接取出即可,不用类型转换,因为已经规定了里面存放的只能是某种类型

      集合中中除了存入定义的泛型类型的实例,还可以存入泛型类型子类的实例

      泛型不能是基本类型,只能是引用类型,如果必须使用基本类型,可以使用基本类型的包装类

      对上一篇文章的例子做一个简单的优化,就很容易理解泛型啦

      课程类,Course.java代码没变

     1 /*
     2  * 课程类,规定课程结构,用于向集合中传入此类型的元素
     3  */
     4 
     5 public class Course {
     6     public String id;
     7     public String name;
     8     public Course(String id,String name){
     9         //含参构造方法
    10         this.id = id;
    11         this.name = name;
    12     }
    13     
    14     public Course(){
    15         //无参构造器,为了子类初始化隐式构造方法
    16     }
    17 }

      课程子类,ChildCourse.java,为了测试泛型的子类型也可以存入List集合

    1 public class ChildCourse extends Course {
    2     //什么都不写,全部继承自父类
    3 }

      泛型测试类,TestGeneric.java

     1 import java.util.ArrayList;
     2 import java.util.List;
     3 
     4 public class TestGeneric {
     5     
     6     public List<Course> courses;    //定义泛型类型的courses属性,规定List中元素只能是Course类型或者子类型的属性
     7     
     8     public TestGeneric(){
     9         this.courses = new ArrayList<Course>();    //初始化courses属性,初始化的时候也必须添加泛型
    10     }
    11     /*
    12      * 向List中添加元素
    13      */
    14     public void testAdd(){
    15         Course cr1 = new Course("1","数据结构");
    16         courses.add(cr1);
    17         //下面添加字符串类型不符合泛型定义的类型,编译器会报错
    18         //courses.add("string");
    19         Course cr2 = new Course("2","Java程序设计");
    20         courses.add(cr2);
    21     }
    22     
    23     /*
    24      * 遍历List中的元素输出
    25      */
    26     public void testForeach(){
    27         System.out.println("有以下课程:");
    28         //因为courses中存储的肯定是Course类型的元素,所以直接遍历即可,不用额外操作
    29         for(Course cr:courses){
    30             System.out.println("课程:" + cr.id + ":" + cr.name);
    31         }
    32     }
    33     
    34     /*
    35      * 测试泛型集合添加泛型子类型对象的实例
    36      */
    37     public void testChild(){
    38         ChildCourse ccr = new ChildCourse();    //子类型是不可以直接传入参数的
    39         ccr.id = "3";
    40         ccr.name = "我是泛型子类型课程对象";
    41         courses.add(ccr);    //添加正常
    42     }
    43     
    44     /*
    45      * 泛型不能使用基本类型
    46      */
    47     public void testBasicType(){
    48         //当规定泛型类型为int时,下面编译器会报错,但是使用包装类没问题
    49         //List<int> list = new ArrayList<int>();
    50         List<Integer> list = new ArrayList<Integer>();
    51         list.add(1);    //自动装箱,把1变为Inreger类型的
    52         System.out.println("基本类型包装类元素:" + list.get(0));
    53     }
    54     
    55     public static void main(String[] args) {
    56         TestGeneric tg = new TestGeneric();
    57         tg.testAdd();
    58         tg.testForeach();
    59         tg.testChild();
    60         tg.testForeach();
    61         tg.testBasicType();
    62     }
    63 
    64 }

      由代码可以看出对集合如何定义泛型,引用属性的添加,子类型的添加、遍历的时候更加简单了,只能添加基本类型的包装类属性

      以上只是简单体现了集合如何使用泛型的属性,另外属性的修改,删除方法都基本一致,所以没有再重复一遍,其实泛型应用不止这些,确实能解决很多开发中的麻烦

  • 相关阅读:
    HDU 2460 Network 傻逼Tarjan
    HTTP状态码
    Spring Tool Suite(STS)安装
    Manajro17配置
    VsCode搭建Java开发环境
    《从零开始搭建游戏服务器》项目管理工具Maven
    Debian9安装MariaDB
    Intellij从无到有创建项目
    PostgreSQL 二进制安装
    Intellij IDEA创建项目
  • 原文地址:https://www.cnblogs.com/freeweb/p/4836376.html
Copyright © 2020-2023  润新知