Welcome 微信登录

首页 / 软件开发 / JAVA / Java范型知识

Java范型知识2014-06-02我相信很多人跟我一样还未学习过范型的概念就开始使用范型的实例,最典型的就是集合框架。为了 进一步深入了解范型,这一次通过几个简单的例子来说明范型的注意事项。

一.没有范型的世界

所有的java类都派生自java.lang.Object ,这意味着所有的java对象都可以转换成Object,听起来似乎 很美妙,但事实并非如此。举个例子,假设现在需要一伙人去排队,要求只有学生可以参与进来,但是如 果对于这个队伍没有条件限定的话,那就意味着我们不想要的一些群体也会进入大军之中,这不利于管理 。再如下面一段没有使用范型的代码:

List string=new ArrayList();

string.add("我是第一个元素");

string.add("我是第二个元素");

当要从中获取一个成员时,得到的却是java.lang.Object的一个实例,那么如果我们要使用String类 型的对象还要进行强转型,这无疑增加了代码的冗杂度。不过幸好,我们有了范型。

二. 范型类型简介

像方法一样,范型类型也可以接受参数,声明范型类型要使用尖括号将类型变量列表括起来。例如声 明一个List对象:

List<E> mylist;

为了将范型类型实例化,要在声明它的时候传递相同的参数列表,例如,为了创建一个使用String的 ArrayList,要将String放在一对尖括号中进行传递:

             List<String> string=new ArrayList<String>();

      不过,java7版本之后,可以在参数化类的构造器中显式的传入参数,上面一 段代码可以改为如下的表达方式:

List<String> string=new ArrayList< >();

毫无疑问范型类型也可以指定Object类型,但是范型类型却不可以是java.lang.Throwable的直接或间 接子类,因为它在运行时抛出异常,因此无法查看在编译时会抛出什么异常。

下面一段代码就对使用了范型与未使用范型的List进行了比较:

Java代码

import java.util.ArrayList;import java.util.List;public class GenericListTest {public static void main(String args[]){//没有使用范型的队列List stringList=new ArrayList();stringList.add("元素1");stringList.add("元素2");//需要强转型String s1=(String)stringList.get(0);System.out.println(s1);//使用范型的队列List<String> list=new ArrayList<String>();list.add("元素3");list.add("元素4");//不需要强转型String s2=list.get(0);System.out.println(s2);}}