Java基础:泛型

  同样是面试当中遇到的问题,在平常写代码的过程当中,经常有使用到泛型编程,比如用到的各种集合方式,如Arraylist、hashmap、List、等,都有使用到泛型。但是当面试官让自己系统的介绍一下泛型编程的时候,自己也突然懵逼了,自己所理解的所谓泛型,就是在声明容器变量的时候,将类型当做参数声明进来,对于泛型的其他特性和好处,自己都没有很系统的了解,特此在此系统的总结一下,java当哈总很重要的一个部分,就是泛型编程。

  在java没有增加泛型类之前,泛型程序的设计是通过继承来实现的,即比如Arraylist来说,其只维护了一个Object引用的数组,当存入其他类型的时候,则通过强值类型转化进行,这样会出现问题,且先看下面的代码:

 public class Test {
 
     public static void main(String[] args) {
         List list = new ArrayList();
         list.add("qqyumidi");
         list.add("corn");
         list.add(100);
 
         for (int i = 0; i < list.size(); i++) {
             String name = (String) list.get(i); // 1
             System.out.println("name:" + name);
         }
     }
 }

  在代碼當中,list变量由于维护的是一个object的数据,而object类型是所有类型的父类,所有可以往该list存入任何类型的实例,在代码中就存入了两个String类型和一个Integer类型的实例,而这样就会导致在读取数组当中的变量的时候,无法提前预知数据当中存入的究竟是什么类型的变量,导致出现强制类型转换异常,比如在例子当中,就会出现读取到第三个Integer型变量的时候,报错。这就是没有泛型类之前,java所面临的问题,只有在程序员自己的脑子里预先定好哪一个类是存储什么类型的变量的容器,而不能体现在代码当中,导致代码的安全性和可读性不高。

  为了解决这个问题,java提出了泛型类的概念,泛型,即“参数化类型”。即如同声明方法的时候需要声明参数的类型,在声明泛型变量的时候,也需要将类型当中变量声明进去,将原来的类型编程了参数的形式,在声明的过程当中声明进去。可以看下面的例子:

public class test {

    public static void main(String[] args) {
        /*
        List list = new ArrayList();
        list.add("qqyumidi");
        list.add("corn");
        list.add(100);
        */

        List<String> list = new ArrayList<String>();
        list.add("qqyumidi");
        list.add("corn");
        //list.add(100);   // 1  提示编译错误

        for (int i = 0; i < list.size(); i++) {
            String name = list.get(i); // 2
            System.out.println("name:" + name);
        }
    }
}

在这个例子当中List在声明的时候,将String当做参数声明进了list变量当中,那么该list就是一个被声明只能存String类型的list了,而这时候还想要往list插入Integer型,则编译器就会检查报错。这样无疑是增加了代码的可读性和安全性。这是从泛型类的一个方面上来看泛型的好处。

  那么从泛型类的使用者的角度来看泛型好处,那么就是一个容器类,使用泛型之后,可以增加代码的重用性,而不需要为每一种变量去编写特定的容器类,比如String类型,去编写一个只能存储String类型的容器,而Integer类型,又只能再去编写一个只能存储Integer类型的容器类,在使用泛型的过程中,我们只需要用<>的形式,将要存储的类型参数化的传入就可以只需要编写一个容器类的代码,而可以将这个容器类用于转载各种类型的实例,这就是从另一方面来看泛型的好处。下面简单的上一个自定义泛型编程的代码:

class Box<T> {

    private T data;

    public Box() {

    }

    public Box(T data) {
        setData(data);
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

}

 

转载于:https://www.cnblogs.com/WellHold/p/7364975.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值