现在重新整理下泛型,前面的整理好多的底层的东西理解不深。泛型很重要的,作为java的一个程碑式的改进,还是很有必要认真的理解下人家的JDK的良苦用心的。

  • 1,什么是泛型?为什么要使用泛型?

一定要记住下面的2句话:

1),保存元素时:泛型解决了元素存储的安全性问题

2),获取元素时:泛型解决了类型强壮的恶心编码味道

详细点来说,java的集合有一个致命的弱点,把一个对象丢在集合里面,集合就会忘记这个对象的数据类型。当我们取出该对象的时候,这个对象的编译类型就变成了Object类型的了,注意,这个时候运行时的类型没有变的。JDK设计成这个样子是有他们的原因的,因为他们要求集合有更好的通用性,所以他们把集合设计成了可以保存任何类型的对象。当时这样子很容易出现2种恶心的地方:

1),添加一个对象到集合中,数据不安全了。比如我想放一个A对象,结果我不小心放入了一个B对象,这样子也是可以的。

2),从这个集合中抓这个对象出来,编译时类型由原来的类型统一变成了Object类型,如果我们使用也只能向下强壮,不仅增加了编程的复杂度,而且很容易引发ClassCastException异常。讲到这里顺便要T一下,我们要养成向下强壮时做类型检查的习惯,具体见下面的代码:

public class Test
{
public void test()
{
Object test = new Object();
//一旦做向下强转,就应该先做类型检查,保证代码健壮性
if (test instanceof Test)
{
Test test1 = (Test) test;
}
}
}

OK,以下是代码演示,如果不使用泛型,让我们试试我们的编码是多么恶心。

public class Test
{
public static void main(String[] args)
{
//首先这里数据不安全,我本来是要想放字符串进集合的,结果不小心放了数字了,丫的编译不会有问题的
List list = Lists.newArrayList();
list.add("1");
list.add(2);
for (Object object : list)
{
//不加入泛型,下面的代码的类型默认都是object的,所以在使用的时候,需要强转
String str = (String) object;
//java.lang.Integer incompatible with java.lang.String
System.out.println(str);
}
}
}

上面的代码编译不存在问题,但是在实际运行时会报类型转换错误,java.lang.Integer incompatible with java.lang.String。





OK,那现在我们来使用泛型,来看下我们的编码。

public class Test
{
public static void main(String[] args)
{
List<String> list = Lists.newArrayList();
list.add("1");
//你要是这里放入list中的对象的类型不对的话,编译就不通过
list.add(2);
//在迭代循环list的时候,也不需要自己来每次强转类型了
for (String str : list)
{
System.out.println(str);
}
}
}

现在来总结下泛型的作用:

1),类型安全。使编译器对泛型定义的类型做判断限制,如保证TreeSet里的元素类型必须一致。

2),消除强制类型的转换,如使用Comparable比较时每次都需要类型强转。

OK,现在关于为什么要使用泛型已经解释的很明白了,下一篇我会详细的介绍下泛型的相关基本语法。

java里程碑之泛型--使用泛型的更多相关文章

  1. Java 8 新特性之泛型的类型推导

    1. 泛型究竟是什么? 在讨论类型推导(type inference)之前,必须回顾一下什么是泛型(Generic).泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据 ...

  2. Java语法糖3:泛型

    泛型初探 在泛型(Generic type或Generics)出现之前,是这么写代码的: public static void main(String[] args) { List list = ne ...

  3. java泛型 8 泛型的内部原理:类型擦除以及类型擦除带来的问题

    参考:java核心技术 一.Java泛型的实现方法:类型擦除 前面已经说了,Java的泛型是伪泛型.为什么说Java的泛型是伪泛型呢?因为,在编译期间,所有的泛型信息都会被擦除掉.正确理解泛型概念的首 ...

  4. java 反射,注解,泛型,内省(高级知识点)

     Java反射 1.Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs    取得任何一个已知名称的class的内部信息, 包括 ...

  5. Java基础---Java---基础加强---内省的简单运用、注解的定义与反射调用、 自定义注解及其应用、泛型及泛型的高级应用、泛型集合的综合

    内省的简单运用: JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则. 采用遍历BeanInfo的所有属性方式来查找和 ...

  6. Java编程的逻辑 (35) - 泛型 (上) - 基本概念和原理

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  7. Java编程的逻辑 (37) - 泛型 (下) - 细节和局限性

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  8. Java泛型:泛型的定义(类、接口、对象)、使用、继承

    地址   http://blog.csdn.net/lirx_tech/article/details/51570138 1. 设计泛型的初衷: 1) 主要是为了解决Java容器无法记忆元素类型的问题 ...

  9. Java基础之多态和泛型浅析

    Java基础之多态和泛型浅析 一.前言: 楼主看了许多资料后,算是对多态和泛型有了一些浅显的理解,这里做一简单总结 二.什么是多态? 多态(Polymorphism)按字面的意思就是“多种状态”.在面 ...

  10. 深入理解什么是Java泛型?泛型怎么使用?【纯转】

    本篇文章给大家带来的内容是介绍深入理解什么是Java泛型?泛型怎么使用?有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所助. 一.什么是泛型 “泛型” 意味着编写的代码可以被不同类型的对象所 ...

随机推荐

  1. SLAVE为什么一直不动了

    导读 遇到SLAVE延迟很大,binlog apply position一直不动的情况如何排查? 问题描述 收到SLAVE延迟时间一直很大的报警,于是检查一下SLAVE状态(无关状态我给隐去了):   ...

  2. [译]Why do people write #!/usr/bin/env python on the first line of a Python script?

    If you have several versions of Python installed, /usr/bin/env will ensure the interpreter used is t ...

  3. cyclictest 简介

    1. cyclictest 简介以及安装 1.1 cyclictest 简介 cyclictest 是什么? 看名字应该就能大致猜出来它是一种 test 程序,Cyclictest的维基主页这么介绍它 ...

  4. MySQL如何插入测试数据

    关于插入MySQL测试数据,这里介绍两种方法: 选择优先级(结合PHP生成测试数据 > 使用存储过程 ). 使用存储过程(建议测试数据小于1000条使用该方法) 具体代码如下: 创建表: mys ...

  5. 开发 | 小程序wx.setScreenBrightness/wx.getScreenBrightness接口测试

    前言 最近接触了微信小程序 API - wx.setScreenBrightness .wx.getScreenBrightness 接口,调用该接口可以调节并显示手机屏幕亮度数据.对于喜欢腾讯新闻. ...

  6. NOI2017&&codeM2017游记

    7.17 坐了一天动车到绍兴,宿舍环境什么的还是很棒的. 7.18 早上开幕式,没啥好看的,例行节目+讲话. 下午笔试,顺利满分,不过ccz挂了一道多选,99分,影响应该不是很大. 练习赛出人意料地没 ...

  7. Codeforces 839C Journey【DFS】

    C. Journey time limit per test:2 seconds memory limit per test:256 megabytes input:standard input ou ...

  8. POJ 2531 暴力深搜

    Network Saboteur Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13494   Accepted: 6543 ...

  9. TCP层的分段和IP层的分片之间的关系 & MTU和MSS之间的关系 (转载)

    首先说明:数据报的分段和分片确实发生,分段发生在传输层,分片发生在网络层.但是对于分段来说,这是经常发生在UDP传输层协议上的情况,对于传输层使用TCP协议的通道来说,这种事情很少发生. 1,MTU( ...

  10. Oracle:FOR循环语句练习

    --打印输出从1到10的正整数DECLARE v_i NUMBER(10) := 0;BEGIN LOOP v_i := v_i + 1; DBMS_OUTPUT.put_line(v_i); EXI ...