Java中泛型的使用

来源:互联网 发布:问卷调查如何数据分析 编辑:程序博客网 时间:2024/05/22 16:38

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。
在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。

在Java中我们使用泛型在集合框架中比较多,比如下面的例子:

ArrayList<String> arrayList = new ArrayList<String>();

我们创建了一个ArrayList的对象,arrayList 指定在这个集合中只能存放String 类型的数据,当我们存入非String类型的数据的时候,编译都不能通过。我们从泛型方法,泛型类,泛型接口三个方面看下这个泛型的使用。

首先泛型方法:

public <T> void A(T t){        System.out.println(t);    }

上面的例子就是一个泛型的方法,我们不能确定传入的参数是什么类型的,就把这个函数定义为泛型的,可以传入我们需要的类型。

接下来我们看一个泛型类的例子:

/**     * 这个类是泛型类     * @author wukj     * @param <T>     */    class B<T>{        public <T> void show(T t){            System.out.println(t);        }        public <Q> void touch(Q q){            System.out.println(q);        }    }    /**     * 这个类中有泛型方法     * @author wukj     *     */class C{        public <T> void show(T t){            System.out.println(t);        }        public <Q> void touch(Q q){            System.out.println(q);        }    }

在上面的例子中有二个类,其中类B是一个泛型类,我们在创建类B的对象的时候,指定了类型之后,调用类B的show 方法的时候,传入的参数类型要和指定的类型匹配,但是对于类B的touch ,并没有这样的要求。对于类C,不是一个泛型类,里面的二个方法都是泛型的,有二个泛型的方法,二者之间没有任何的关系,可以传不同类型的参数。

泛型方法使用过程中需要特别注意的一个知识点是静态的方法上的类型不能和类上的泛型相同,比如下面的代码:

class D<T>{    public static <T>  void show(){        .......    }

因为static的方法是在创建对象之前调用的,在未创建对象之前就调用这个方法,泛型的类型还没有确定下来。

最后我们看点泛型的接口:

interface  Inter<T t>{void  show(T t);}

定义了一个接口,我们可以创建一个类去实现这个接口:

class InterImp implements Inter<String>{   public void show(String s){     ......     }}

如果实现接口的时候也不能确定参数的类型,那么这个类只好也是泛型类:

class InterImp <T> implements Inter<T>{public void show(T t){.......}

最后还有一个小的知识点是,关于通配符的使用:

public static  void   printColl(Arraylist<?> al){   Iterator <?> it = al.iterator();   while(it.hasNext()){   System.out.println(it.next);  } }

上面的? 即使通配符。

关于泛型就总结了这些知识点,博客中的问题,希望大家留言给我。

0 0