java里程碑之泛型--使用泛型
2015-10-19 15:48
357 查看
现在重新整理下泛型,前面的整理好多的底层的东西理解不深。泛型很重要的,作为java的一个程碑式的改进,还是很有必要认真的理解下人家的JDK的良苦用心的。
1,什么是泛型?为什么要使用泛型?
一定要记住下面的2句话:
1),保存元素时:泛型解决了元素存储的安全性问题
2),获取元素时:泛型解决了类型强壮的恶心编码味道
详细点来说,java的集合有一个致命的弱点,把一个对象丢在集合里面,集合就会忘记这个对象的数据类型。当我们取出该对象的时候,这个对象的编译类型就变成了Object类型的了,注意,这个时候运行时的类型没有变的。JDK设计成这个样子是有他们的原因的,因为他们要求集合有更好的通用性,所以他们把集合设计成了可以保存任何类型的对象。当时这样子很容易出现2种恶心的地方:
1),添加一个对象到集合中,数据不安全了。比如我想放一个A对象,结果我不小心放入了一个B对象,这样子也是可以的。
2),从这个集合中抓这个对象出来,编译时类型由原来的类型统一变成了Object类型,如果我们使用也只能向下强壮,不仅增加了编程的复杂度,而且很容易引发ClassCastException异常。讲到这里顺便要T一下,我们要养成向下强壮时做类型检查的习惯,具体见下面的代码:
OK,以下是代码演示,如果不使用泛型,让我们试试我们的编码是多么恶心。
OK,那现在我们来使用泛型,来看下我们的编码。
现在来总结下泛型的作用:
1),类型安全。使编译器对泛型定义的类型做判断限制,如保证TreeSet里的元素类型必须一致。
2),消除强制类型的转换,如使用Comparable比较时每次都需要类型强转。
OK,现在关于为什么要使用泛型已经解释的很明白了,下一篇我会详细的介绍下泛型的相关基本语法。
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 HashMap和IdentityHashMap
- 在java程序中开启另一个java程序
- Java从键盘获取输入值
- struts2配置文件解析
- Java7中的switch...case支持string的实现细节
- Java中,String类型和包装类型作为参数传递时,是属于值传递还是引用传递呢?
- java 传递参数的两种方式
- Uploadify配置记录以及上传Session丢失问题解决java版
- 【Java基础】继承中的代码块和构造方法的执行顺序探索
- 严重: Error starting static Resources java.lang.IllegalArgumentException
- java中super和this关键字解析
- Java基础知识学习(九)
- eclipse adb 无法启动
- Java设计模式----单例模式(Singleton)
- Java设计模式----单例模式(Singleton)
- java 校验公民身份证有效性
- 关于java内存泄漏
- Struts2-运行流程分析
- c3p0、dbcp数据源在spring的配置
- SpringMVC访问静态页面