Java学习笔记08 泛型

来源:互联网 发布:快速排序算法最坏情况 编辑:程序博客网 时间:2024/05/17 02:43

1.概述

JDK1.5版本以后的新特性。用于解决安全问题,是一种安全机制。
好处:

  1. 将运行时期出现的问题ClassCastException转移到了编译时期,方便于程序员解决问题。让运行时期问题减少。更加的安全。
    泛型技术其实应用在编译时期,是给编译器使用的技术,到了运行时期,泛型就不存在了(泛型的擦除)。也就是说,编辑器检查了泛型的类型正确后,在生成的类文件中是没有泛型的。

  2. 避免了强制类型转换的麻烦。可以知道获取的元素类型而不用强转换。
    泛型的补偿:因为存储的时候,类型已经确定了是同一个类型的元素,所以在运行时,只要获取到该元素的类型,在内部进行一次转换即可,所以使用者不用再做转换动作了。

2.泛型的格式

通过<>来定义要操作的引用数据类型。只要带有<>的类或者接口,都属于带有类型参数的类或者接口,在使用这些类或者接口时,必须给<>中传递一个具体的引用数据类型。这在集合框架中很常见,当使用集合时,将集合中要存储的元素的数据类型作为参数,传递到<>中即可。

3.泛型类、接口和泛型方法

当类中的操作的引用数据类型不确定的时候,以前用的Object来进行扩展的,现在可以用泛型来表示。
泛型类定义的泛型在整个类中有效,如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有方法要操作的类型就已经固定了。为了让不同的方法可以操作不同的类型,而且类型还不确定,那么可以将泛型定义在方法上,即为泛型方法。如代码示例:

class Tool<Q> //将泛型定义在类上{    private Q obj;    public void setObject(Q obj)     {        this.obj = obj;    }    public Q getObject()     {        return obj;    }    public <W> void method(W w) //将泛型定义在方法上    {        System.out.println("method:"+w);    }}interface Inter<T> //泛型接口{    void show(T t);}class InterImpl<R> implements Inter<R> {    public void show(R r)     {        System.out.println("show:"+r);    }}

注意:

  • 格式:写在返回类型前,修饰符后面。
  • 静态方法 不可以返回类上定义的泛型。如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上。静态方法的泛型一定定义在方法上。

4.泛型限定

< ? > : 通配符(也叫占位符),表示任意类型。当操作类型时,具体类型不确定,不需要使用类型的具体功能,只使用Object类中的功能时,那么可以用 < ? > 通配符来表未知类型。

< ? extends E> :上限限定,可以接收E类型或者E的子类型对象。
当方法内要调用某个特定的方法时,可以设定上限E,因为E和E的子类都具有该方法。

< ? super E>:下限限定,可以接收E类型或者E的父类型对象。
当方法被调用时,会传入的参数为某个特定类型的对象,该方法可以使用下限限定。因为E类型或者E的父类类型都可以接收E类型的对象作为实参。

泛型的细节:
1. 泛型到底代表什么类型取决于调用者传入的类型,如果没传,默认是Object类型。
2. 使用带泛型的类创建对象时,等式两边指定的泛型必须一致。
原因:编译器检查对象调用方法时只看变量,然而程序运行期间调用方法时就要考虑对象具体类型了。
3. 等式两边可以在任意一边使用泛型,在另一边不使用(考虑向后兼容)。如:

ArrayList<String> al = new ArrayList<Object>(); //错//要保证左右两边的泛型具体类型一致。ArrayList<? extends Object> al = new ArrayList<String>();al.add("aa"); //错/*因为集合具体对象中既可存储String,也可以存储Object的其他子类,所以添加具体的类型对象不合适,类型检查会出现安全问题。<?extends Object> 代表Object的任意子类型,不能添加具体类型的对象。*/public static void method(ArrayList<? extends Object> al) {    al.add("abc"); //错    //只能对al集合中的元素调用Object类中的方法,具体子类型的方法都不能用,因为子类型不确定。}
0 0
原创粉丝点击