首先我们先提出两个问题:

  • 什么是泛型?
  • 为什么要使用泛型?
    我们先来看看第一个问题什么是泛型。如果你对Java三大特性中的多态性理解的比较透彻的话,泛型就比较好理解了。多态性表示一个对象具备多种状态。比如说你自己,你首先是一个人,同时你在看这篇帖子说明你是一个程序员,下了班之后你可能有变成了禽兽。所以你具备这人形态,程序员形态,和兽形态,这就是多态,一种事物具备多种状态!而泛型就更加纯粹的多态,他可以是任何一种形态,俗称变态(开个玩笑o(∩_∩)o)。泛型的意思就是可以表示任何一种形态,任何一种数据类型。这就好像情人节你女朋友送你的礼物一样,你先拿到的是一个礼物包装盒,而盒子里面可能是一个钱包,也可能是一个高档打火机,还有可能是一坨屎!盒子里面有可能是任何一种事物,你对此完全不知道,你知道你会收到这样一份礼物,而礼物具体是什么,你全然不知。
 public class GrilFriend<T> {

    private T t;

    public void buyGift(T t) {
this.t = t;
} public T getGift() {
return t;
} public static void main(String[] args) {
GrilFriend<Shit> myGrilFriend = new GrilFriend<Shit>();
myGrilFriend.buyGift(new Shit("狗屎"));
Shit gift = myGrilFriend.getGift();
System.out.println(gift.name);
} } class Shit { final String name; public Shit(String name) {
this.name = name;
} }

这就是泛型,你永远不知道你女朋友会送你什么礼物,这里的礼物可能是任何一种类型(她可能会真的送你一坨屎)

接下来我们来看我们为什么要使用泛型 ,相信List集合容器,大家都用的滚瓜烂熟了,我们先来看下List的源码

public interface List<E> extends Collection<E> {
public boolean add(E object);
public boolean addAll(Collection<? extends E> collection);
public E get(int location);
}

我们只看这几个我们常用的方法,我们知道List是一个容器,它就是使用了泛型,我们才可以用List来存储任何一种数据类型,有的小伙伴就会说,那用顶级父类Object还不是一样可以实现这样的功能,代码如下:

public interface List extends Collection {
public boolean add(Object object);
public boolean addAll(Collection<? extends Object> collection);
public Object get(int location);
}

确实这样也能实现多种数据的存储,但是有一个很严重的缺陷,当我们用Object来接数据的时候,一旦数据存储到容器中,容器就会忘记存储的数据类型,因为只知道当前对象是Object类型,我们使用起来的代码就会变成这样

        List list = new ArrayList();
list.add("hhhh");
list.add("eeee");
list.add("wwww");
for (int i = 0; i < list.size(); i++) {
// 每次取数据 都需要进行强转操作
String object = (String) list.get(i);
System.out.println(object);
} List list2 = new ArrayList();
list2.add("hhhh");
list2.add("eeee");
list2.add("wwww");
//如果这里不小心添加的多种数据类型,编译器不会有任何提示信息
list2.add(1);
for (int i = 0; i < list.size(); i++) {
// 当使用强转是就会报ClassCastException
String object = (String) list.get(i);
System.out.println(object);
}

如果List使用的是Object而不是泛型的话,集合容器使用起来就没那么顺手了。使用泛型能极大的提高我们程序的灵活性和拓展性,比如我写的万能适配器中 就使用了泛型来进行数据源的通用化处理。从上面两个例子可以看出泛型的使用场景:当数据类型不确定时,或者说需要使用多个数据类型时,泛型则是不错的选择。

Java高级特性之泛型的更多相关文章

  1. paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型

    paip.java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...

  2. Java高级特性-String、StringBuffer和StringBuilder

    Java高级特性-String.StringBuffer和StringBuilder String Java语言中的字符串值都属于String类,虽然有其他方法表示字符串(如字符串数组),但Java一 ...

  3. java高级特性增强

    第4天 java高级特性增强 今天内容安排: 1.掌握多线程 2.掌握并发包下的队列 3.了解JMS 4.掌握JVM技术 5.掌握反射和动态代理 java多线程增强 .1. java多线程基本知识 . ...

  4. Java高级特性——反射机制(第二篇)

    在Java高级特性——反射机制(第一篇)中,写了很多反射的实例,可能对于Class的了解还是有点迷糊,那么我们试着从内存角度去分析一下. Java内存 从上图可以看出,Java将内存分为堆.栈.方法区 ...

  5. Java高级特性1_流库_初体验

    Java高级特性流库_初体验 面对结果编程 在编程里, 有两种编程方式, 一种是面对过程编程, 一种是面对结果编程. 两者区别如下 面向过程编程 面向过程编程需要编程程序让程序依次执行得到自己想要的结 ...

  6. Java高级特性 第1节 集合框架和泛型

    Java中,存储多个同类型的数据,可以用数组来实现,但数组有一些缺陷: 数组长度固定不变,布恩那个很好的适应元素数量动态变化的情况 可以通过数组.length获取数组长度,却无法直接获取数组中实际存储 ...

  7. 云端卫士实战录 | Java高级特性之多线程

    <实战录>导语 一转眼作为一名Java开发者已经四年多时间了,说长不长说短不短,对于java的感情还是比较深的,主要嘛毕竟它给了我饭吃.哈哈,开个玩笑.今天我想借此机会来和大家聊聊Java ...

  8. JAVA 高级特性枚举和泛型

    枚举: 语法:  public enum 枚举名 { 枚举值表(罗列所有值) }  例如:  public enum EnumTest{MON,TUE,WED.THU,FRI,SAT,SUN} 枚举操 ...

  9. Java高级特性—并发包

    1). java并发包介绍 JDK5.0 以后的版本都引入了高级并发特性,大多数的特性在java.util.concurrent 包中,是专门用于多线程发编程的, 主要包含原子量.并发集合.同步器.可 ...

随机推荐

  1. springMVC获取数据--注意post方法会出现中文乱码问题

    1. 新建web project 2. 加入jar 3. 改写web.xml <?xml version="1.0" encoding="UTF-8"?& ...

  2. 【BZOJ3524/2223】[Poi2014]Couriers 主席树

    [BZOJ3524][Poi2014]Couriers Description 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大 ...

  3. redis对比memcached

    摘要 : 简单地比较Redis与Memcached的区别,大多数都会得到以下观点: 1  Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储. 2  Re ...

  4. ZooKeeper 的安装和配置---单机和集群

    如题本文介绍的是ZooKeeper 的安装和配置过程,此过程非常简单,关键是如何应用(将放在下节及相关节中介绍). 单机安装.配置: 安装非常简单,只要获取到 Zookeeper 的压缩包并解压到某个 ...

  5. 使用myeclipse新建和删除web项目时一定要小心

    今天使用myeclipse在非工作空间的路径下新建一个web项目,路径内包含了原有一些web项目,可是我在指定位置时,在那个路径下多写一个子目录的路径,以为myeclipse会 为我默认新建子目录以便 ...

  6. jquery选择器 之 获取父级元素、同级元素、子元素 - yes的日志 - 网易博客

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  7. golang中container/heap包源码分析

    学习golang难免需要分析源码包中一些实现,下面就来说说container/heap包的源码 heap的实现使用到了小根堆,下面先对堆做个简单说明 1. 堆概念 堆是一种经过排序的完全二叉树,其中任 ...

  8. man info --help区别

    --help: 是一个工具选项,可以用来显示一些工具的信息 man : 可以显示系统手册页中的内容,这些内容大多数都是对命令的解释信息 PS: () Space 键可以显示下一屏的文本信息 () q ...

  9. JAVA基础--工厂模式

    interface Fruit{ // 定义一个水果接口 public void eat() ; // 吃水果 } class Apple implements Fruit{ public void ...

  10. Jsoup使用教程

    一.解析和遍历一个HTML文档1.解析Html及Url链接 String html = "<html><head><title>First parse&l ...