java 泛型小总结
2016-03-25 16:14
344 查看
1、首先来说一下什么是泛型,为什么java要引入泛型
泛型是Java1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。泛型使用最多的地方就是集合。 Java语言引入泛型的好处是安全简单。为什么说是安全简单呢,通过下面的一个小例子说明:
上面是一个简单的例子,目的就是刻意的突出在未使用泛型的时候会出现的一些错误。我们在编写代码的时候总是希望错误越早出现越好,而上面例子只有在运行的时候才出错,这样如果在实际的开发中的话就需要我们来调试到底是哪里出了错。但是加了泛型就不一样了,在创建集合的时候就定义了集合中参数的类型,就能很好的避免这样的麻烦。
如果在创建集合的时候就定义了集合中数据的类型,那么在(1)位置就会报错。这样就及早的发现避免了一些错误。
上面的代码虽然在创建集合的时候用的不同类型的参数,但是在输出他们的class的时候是同一个,这说明jvm在编译的时候并没有把泛型编译进去。
除了原生态的类型外,还有参数化的类型,下表是在effective java (第二版)中的
可以看到可以使用形式参数和通配符进一步提高代码的实用性。
注意:
1、如果只指定了<?>,而没有extends,则默认是允许Object及其下的任何Java类了。也就是任意类。
2、通配符泛型不单可以向下限制,如<? extends Collection>,还可以向上限制,如<? super Double>,表示类型只能接受Double及其上层父类类型,如Number、Object类型的实例。
3、泛型类定义可以有多个泛型参数,中间用逗号隔开,还可以定义泛型接口,泛型方法。这些都与泛型类中泛型的使用规则类似。
下面是程序得运行结果:
java.lang.String
java.lang.Integer
java.lang.Character
InitClass
java.util.ArrayList
泛型是Java1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。泛型使用最多的地方就是集合。 Java语言引入泛型的好处是安全简单。为什么说是安全简单呢,通过下面的一个小例子说明:
List list = new ArrayList(); list.add("qwe"); list.add(234); for(int i = 0;i < list.size(); i++){ String str = (String)list.get(i); System.out.println(str); }
上面是一个简单的例子,目的就是刻意的突出在未使用泛型的时候会出现的一些错误。我们在编写代码的时候总是希望错误越早出现越好,而上面例子只有在运行的时候才出错,这样如果在实际的开发中的话就需要我们来调试到底是哪里出了错。但是加了泛型就不一样了,在创建集合的时候就定义了集合中参数的类型,就能很好的避免这样的麻烦。
List<String> list = new ArrayList<String>(); list.add("qwe"); list.add(234); //(1)
如果在创建集合的时候就定义了集合中数据的类型,那么在(1)位置就会报错。这样就及早的发现避免了一些错误。
List<Integer> l = new ArrayList<Integer>(); List<Object> l2 = new ArrayList<Object>(); System.out.println(l.getClass()); //class java.util.ArrayList System.out.println(l2.getClass()); //class java.util.ArrayList System.out.println(l.getClass()==l2.getClass()); //true
上面的代码虽然在创建集合的时候用的不同类型的参数,但是在输出他们的class的时候是同一个,这说明jvm在编译的时候并没有把泛型编译进去。
除了原生态的类型外,还有参数化的类型,下表是在effective java (第二版)中的
可以看到可以使用形式参数和通配符进一步提高代码的实用性。
public class Demo { public static void main(String[] args){ // 实例化泛型类 Point<Integer, Integer> p1 = new Point<Integer, Integer>(); p1.setX(10); p1.setY(20); int x = p1.getX(); int y = p1.getY(); System.out.println("This point is:" + x + ", " + y); Point<Double, String> p2 = new Point<Double, String>(); p2.setX(25.4); p2.setY("东京180度"); double m = p2.getX(); String n = p2.getY(); System.out.println("This point is:" + m + ", " + n); } } // 定义泛型类 class Point<T1, T2>{ T1 x; T2 y; public T1 getX() { return x; } public void setX(T1 x) { this.x = x; } public T2 getY() { return y; } public void setY(T2 y) { this.y = y; } }
注意:
1、如果只指定了<?>,而没有extends,则默认是允许Object及其下的任何Java类了。也就是任意类。
2、通配符泛型不单可以向下限制,如<? extends Collection>,还可以向上限制,如<? super Double>,表示类型只能接受Double及其上层父类类型,如Number、Object类型的实例。
3、泛型类定义可以有多个泛型参数,中间用逗号隔开,还可以定义泛型接口,泛型方法。这些都与泛型类中泛型的使用规则类似。
下面是程序得运行结果:
java.lang.String
java.lang.Integer
java.lang.Character
InitClass
java.util.ArrayList
相关文章推荐
- struts2.properties
- Spring和Mybatis整合时无法读取properties的处理方案
- 做一个合格的程序猿之浅析Spring AOP源码(十七) Spring AOP开发大作战
- Rxjava原理探索:切换线程,变换
- java中的url 编码与解码
- eclipse转Android studio遇到的那些坑
- Java 线程池
- 使用springmvc注解后404错误
- JAVA选项详解(长期更新)
- 码农小汪-struts2学习4-struts.xml 常用配置解析
- java对象转换String类型
- java中的自增过程不是原子性操作
- Java中由substring方法引发的内存泄漏
- 使用java.nio类库实现的Socket
- thinking in java 笔记4
- Spring对Hibernate事务管理
- 16、java代码注释规范
- Java GC 及HBase RegionServer GC调优
- eclipse新建web项目运行时出现The requested resource is not available异常
- 《Java 2 实用教程》读书笔记(四)4.4