java基础之泛型用法
2014-06-22 13:34
417 查看
1.什么是泛型
泛型是java中保障类型安全的一种机制。它通过对变量类型的假设,实现变量类型的进行限制,从而在一定程度上保证程序编译时变量类型的安全。反之,如果没有泛型,这些假设则只存在于程序员的大脑中,这样会导致类型转换的异常在程序运行时才被发现。
2.多泛型
多泛型是指,在一个类型定义时使用多个泛型。在Map中多见多泛型的应用。如下:
3.限制泛型可用类型
不限制泛型类别时,可以使用任何类型来实例化泛型类型中的类型。即在不设置默认类型时,泛型类型通常是Object,但在实际开发中,我们往往需要对类型加以限制,指定泛型类型只能在一定的范围内。java泛型中给我们提供了这样的机制,通过extends关键字,我们就可以指定泛型类型范围,这里指定的类型必须是继承自某个类或实现某个接口。具体定义如下:
个人理解类型通配符的使用,是为了实现在定义泛型类持有者时,限制泛型可用类型的范围,扩展泛型类型持有者对象可接纳类型的范围。代码示意如下:
注意上述代码中,当向list中add null时,代码是编译通过的,而当放入字符串“haha”时,则编译不通过,按常理分析,Object类为所以类型的父类,应该是编译通过的。但事实上并非如此,因为从list的定义来看,list只允许放Object的子类,但不知道具体放什么类型,如果能放入具体类型的话,这就意味着当我们再取出时,必须记得它是什么类型,然后强制转换获得该放进去的值,这样就失去了泛型的意义。
泛型是java中保障类型安全的一种机制。它通过对变量类型的假设,实现变量类型的进行限制,从而在一定程度上保证程序编译时变量类型的安全。反之,如果没有泛型,这些假设则只存在于程序员的大脑中,这样会导致类型转换的异常在程序运行时才被发现。
//不用泛型 List list1 = new ArrayList(); list1.add(1); Object o = list1.get(0); //返回Object类型对象 Integer i = (Integer) o; //需预先知道类型 //用泛型 List<String> list2 = new ArrayList<String>(); list2.add("aaa"); String str = list2.get(0); //直接返回定义时指定的类型,防止类型转换异常
2.多泛型
多泛型是指,在一个类型定义时使用多个泛型。在Map中多见多泛型的应用。如下:
Map<String,String> map = new HashMap<String,String>(); Set<Map.Entry<String,String>> set = map.entrySet(); for(Iterator<Map.Entry<String,String>> iter = set.iterator();iter.hasNext();){ String key = iter.next().getKey(); String value = iter.next().getValue(); }
//多泛型定义 public class MutilGeneric<T,E> {
<span style="white-space:pre"> </span>private T attr1; //定义成员变量 <span style="white-space:pre"> </span>private E attr2;
3.限制泛型可用类型
不限制泛型类别时,可以使用任何类型来实例化泛型类型中的类型。即在不设置默认类型时,泛型类型通常是Object,但在实际开发中,我们往往需要对类型加以限制,指定泛型类型只能在一定的范围内。java泛型中给我们提供了这样的机制,通过extends关键字,我们就可以指定泛型类型范围,这里指定的类型必须是继承自某个类或实现某个接口。具体定义如下:
/** * 定义泛型类,限制类型只能为List<Person>的子类 * @author caoxr * @param <T> */ public class PersonSeqUtil<T extends List<Person>> {4.类型通配符<?>或<? extends ClassType>
个人理解类型通配符的使用,是为了实现在定义泛型类持有者时,限制泛型可用类型的范围,扩展泛型类型持有者对象可接纳类型的范围。代码示意如下:
PersonSeqUtil<LinkedList<Person>> psu1 = new PersonSeqUtil<LinkedList<Person>>(); PersonSeqUtil<ArrayList<Person>> psu2 = new PersonSeqUtil<ArrayList<Person>>(); //运用通配符定义PersonSeqUtil对象,使其传入类型只能为List<person>的子类 PersonSeqUtil<? extends List<Person>> psu = null; psu = new PersonSeqUtil<LinkedList<Person>>(); psu = new PersonSeqUtil<ArrayList<Person>>(); //也可以通过super定义,要求指定类型为指定继承类型的父类 PersonSeqUtil<? super ArrayList<Person>> psu3 = null; psu3 = new PersonSeqUtil<List<Person>>(); List<? extends Object> list = new ArrayList<Object>(); list.add(null); list.add("haha"); //报错,编译不通过
注意上述代码中,当向list中add null时,代码是编译通过的,而当放入字符串“haha”时,则编译不通过,按常理分析,Object类为所以类型的父类,应该是编译通过的。但事实上并非如此,因为从list的定义来看,list只允许放Object的子类,但不知道具体放什么类型,如果能放入具体类型的话,这就意味着当我们再取出时,必须记得它是什么类型,然后强制转换获得该放进去的值,这样就失去了泛型的意义。
相关文章推荐
- java 基础知识(泛型用法总结)
- Java基础(21):泛型—泛型的定义、用法与类型通配符的使用方式
- Java5泛型的用法,T.class的获取和为擦拭法站台
- Java基础:Java泛型编程快速入门
- java泛型vector的用法
- Java基础(1)-泛型
- java基础加强--泛型(Generic)的应用
- Java下的框架编程(2)-对泛型的没心没肺的用法和为擦拭法站台
- Java基础学习笔记(九)Comparable接口、Map接口、泛型
- Java基础----MessageBox的用法
- Java基础:第十八讲 String用法(上)
- Java语言基础:泛型
- Java基础:Java泛型编程快速入门
- Java打开窗体基础用法
- Java下的框架编程(2)-对泛型的没心没肺的用法和为擦拭法站台
- Java语言基础之String及StringBuffer之二(用法)
- 泛型在Java中的用法。(摘自精通Jbuilder 2005)
- Java5泛型的用法,T.class的获取和为擦拭法站台
- Java基础:Java泛型编程快速入门
- Java基础学习笔记(九)Comparable接口、Map接口、泛型