Java高级特性之泛型
首先我们先提出两个问题:
- 什么是泛型?
- 为什么要使用泛型?
我们先来看看第一个问题什么是泛型。如果你对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高级特性之泛型的更多相关文章
- paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型
paip.java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...
- Java高级特性-String、StringBuffer和StringBuilder
Java高级特性-String.StringBuffer和StringBuilder String Java语言中的字符串值都属于String类,虽然有其他方法表示字符串(如字符串数组),但Java一 ...
- java高级特性增强
第4天 java高级特性增强 今天内容安排: 1.掌握多线程 2.掌握并发包下的队列 3.了解JMS 4.掌握JVM技术 5.掌握反射和动态代理 java多线程增强 .1. java多线程基本知识 . ...
- Java高级特性——反射机制(第二篇)
在Java高级特性——反射机制(第一篇)中,写了很多反射的实例,可能对于Class的了解还是有点迷糊,那么我们试着从内存角度去分析一下. Java内存 从上图可以看出,Java将内存分为堆.栈.方法区 ...
- Java高级特性1_流库_初体验
Java高级特性流库_初体验 面对结果编程 在编程里, 有两种编程方式, 一种是面对过程编程, 一种是面对结果编程. 两者区别如下 面向过程编程 面向过程编程需要编程程序让程序依次执行得到自己想要的结 ...
- Java高级特性 第1节 集合框架和泛型
Java中,存储多个同类型的数据,可以用数组来实现,但数组有一些缺陷: 数组长度固定不变,布恩那个很好的适应元素数量动态变化的情况 可以通过数组.length获取数组长度,却无法直接获取数组中实际存储 ...
- 云端卫士实战录 | Java高级特性之多线程
<实战录>导语 一转眼作为一名Java开发者已经四年多时间了,说长不长说短不短,对于java的感情还是比较深的,主要嘛毕竟它给了我饭吃.哈哈,开个玩笑.今天我想借此机会来和大家聊聊Java ...
- JAVA 高级特性枚举和泛型
枚举: 语法: public enum 枚举名 { 枚举值表(罗列所有值) } 例如: public enum EnumTest{MON,TUE,WED.THU,FRI,SAT,SUN} 枚举操 ...
- Java高级特性—并发包
1). java并发包介绍 JDK5.0 以后的版本都引入了高级并发特性,大多数的特性在java.util.concurrent 包中,是专门用于多线程发编程的, 主要包含原子量.并发集合.同步器.可 ...
随机推荐
- 嵌入式linux插入内核模块Error: could not insert module xxx.ko: Device or resource busy处理
设备号冲突导致 处理方法: 1.输入$cat /proc/devices 查看驱动的设备号 2.选择一个不冲突的设备号进行编译 参考文献: 1.http://blog.csdn.net/zzc_19/ ...
- 关于css3的calc()
么是calc()? 学习calc()之前,我们有必要先知道calc()是什么?只有知道了他是个什么东东?在实际运用中更好的使用他. calc()从字面我们可以把他理解为一个函数function.其实c ...
- NSString之Format
三点用法总结: 类型转换:基本类型到对象类型 需要调用NSString的fotmat方法 NSString *location = [NSString stringWithFormat:@&quo ...
- Pop框架简述
Facebook发布了Paper之后,进一步开源了其背后的动画引擎Pop,此框架并不满足于苹果自身的动画单调性,致力于给用户一种逼真的动画效果,可以减少用户对于苹果原生Core Animation 复 ...
- RabbitMQ 消息队列 配置
CentOS 7 x64 rabbitmq 一.CentOS 7 yum 添加epel 源 yum -y install epel-release 1. yum -y install erlang ...
- nginx keepalived 主从切换
注: LVS + Keepalived 不知道为什么出现一个很郁闷的问题....... ------------------------------------------------------ ...
- nginx 防 webshell 跨目录
对于在一台服务器上有多个虚拟主机的人来说,Apache有一个很好用的地方---配置php_admin_value,在里面配置一下 open_basedir就可以了. 但是Nginx却没有这样的设置 ...
- codeforces #304 DIV2
先送上一篇题解(虽然全英文的):http://codeforces.com/blog/entry/18034 A题:http://codeforces.com/problemset/problem/5 ...
- sencha cmd常用命令汇总
一.sencha generate:自动生成项目或者代码 1.sencha generate app 项目名称 生成路径 :生成一个新的extjs项目 注明:以上命令会从官网下载试用版本的ext代码到 ...
- 全方位分析Objcetive-C Runtime 分类: ios技术 2015-03-11 22:29 77人阅读 评论(0) 收藏
本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 简介 与Runtime交互 ...