泛型(一)(浅层介绍---好处)
2016-03-23 15:08
183 查看
泛型技术的由来:
集合中可以存储任意类型对象,但是在取出时,如果要使用具体对象的特有方法时,需要进行向下转型,如果存储的对象类型不一致,在转型过程中就会出现ClassCastException异常。这样就给程序带来了不安全性。
在jdk1.5以后就有了解决方案——泛型技术:在存储元素时,就不允许存储不同类型的元素。存储了就编译失败。 所以就需要在存储元素时,在容器上明确具体的元素类型,这其实和数组定义很像。
好处:
1)将运行时期的ClassCastException异常转移到了编译时期,进行检查,并以编译失败来体现。 这样有利于程序员尽早解决问题。
2)避免了向下转型(强转)的麻烦。
什么时候写泛型呢?
只要在使用类或者接口时,该类或者接口在api文档描述时都带着<>,就需要在使用时定义泛型。
其实,泛型无非就是通过<>定义了一个形式参数,专门用于接收具体的引用类型。在使用时,一定要传递对应的实际参数类型。
集合中泛型的应用特别多见。
泛型的擦除:
泛型技术是用于编译时期的技术,编译器会按照<>中的指定类型对元素进行检查,检查不匹配,就编译失败,匹配,就编译通过,通过后,生产的class文件中是没有泛型的,这就成为泛型的擦除。
泛型的补偿:
运行时,可以根据具体的元素对象获取其具体的类型,并用该类型对元素进行自动转换。
public class MySet<E> {}此时该类能接受指定的类型,E 形式类参数
public boolean add(E obj){}可以将E当做类型来用作参数,也可以当返回值
注意:不可new E,只是类的泛型参数。
集合中可以存储任意类型对象,但是在取出时,如果要使用具体对象的特有方法时,需要进行向下转型,如果存储的对象类型不一致,在转型过程中就会出现ClassCastException异常。这样就给程序带来了不安全性。
在jdk1.5以后就有了解决方案——泛型技术:在存储元素时,就不允许存储不同类型的元素。存储了就编译失败。 所以就需要在存储元素时,在容器上明确具体的元素类型,这其实和数组定义很像。
好处:
1)将运行时期的ClassCastException异常转移到了编译时期,进行检查,并以编译失败来体现。 这样有利于程序员尽早解决问题。
2)避免了向下转型(强转)的麻烦。
什么时候写泛型呢?
只要在使用类或者接口时,该类或者接口在api文档描述时都带着<>,就需要在使用时定义泛型。
其实,泛型无非就是通过<>定义了一个形式参数,专门用于接收具体的引用类型。在使用时,一定要传递对应的实际参数类型。
集合中泛型的应用特别多见。
泛型的擦除:
泛型技术是用于编译时期的技术,编译器会按照<>中的指定类型对元素进行检查,检查不匹配,就编译失败,匹配,就编译通过,通过后,生产的class文件中是没有泛型的,这就成为泛型的擦除。
泛型的补偿:
运行时,可以根据具体的元素对象获取其具体的类型,并用该类型对元素进行自动转换。
//演示泛型的好处之一:没采用泛弄,对元素的处理不安全。泛型可以把运行期的错误提前到编译期 public static void t1(){ //List list = new ArrayList();//无泛型 List<String> list = new ArrayList<String>();//无泛型 list.add("aaaqqqq"); list.add("abaqqqq"); list.add("cccqqqq"); //list.add(100); //无泛型时,此处不会报错,但有泛型时会报错。 Iterator it = list.iterator(); while(it.hasNext()){ Object obj = it.next(); String str = (String)obj; str = str.substring(1, 4); System.out.println(str); } } //演示泛型的好处之二:从集合中读取的数据不需要强转,能够自动识别 public static void t2(){ //List list = new ArrayList();//无泛型 List<String> list = new ArrayList<String>(); list.add("aaaqqqq"); list.add("abaqqqq"); list.add("cccqqqq"); Iterator<String> it = list.iterator(); while(it.hasNext()){ //String str =(String) it.next();//无泛型,必须强转 String str = it.next();//List有泛型,并且Iterator也加泛型,那么这里就不用强转. str = str.substring(2); System.out.println(str); } System.out.println("------------"); for(Object obj:list){ System.out.println(obj); } //※泛型的好处之二:从集合中读取的数据不需要强转,能够自动识别 for(String str:list){ System.out.println(str); } }自己可以定义一个加泛型的类
public class MySet<E> {}此时该类能接受指定的类型,E 形式类参数
public boolean add(E obj){}可以将E当做类型来用作参数,也可以当返回值
注意:不可new E,只是类的泛型参数。
相关文章推荐
- 当下的云计算浅谈
- 安装SQLserver的注意事项
- AFNetworking的实现原理
- android 系统版本信息工具类 获取设备型号 设置屏幕亮度 软键盘 获取屏幕高度宽度
- easyUI Layout自适应窗口大小
- EF Profiler 查看跟踪Entity Framework SQL 语句
- iOS UIView的几个layout方法-layoutSubviews、layoutIfNeeded、setNeedsLayout
- 不要暴露.git
- 在Global.asax文件里实现通用防SQL注入漏洞程序(适应于post/get请求)
- [C++][语言语法]标准C++中的string类的用法总结
- 3n+1问题
- jni生成头文件
- 系统设计的角度看GlusterFS&&ceph
- C++中继承与多态
- Cell上删除按钮
- Linux(Ubuntu)入门
- elasticsearch2.21 windows安装
- Java实现查找替换功能
- 通过java.net.URLConnection发送HTTP请求的方法
- 滑动监听的方法