深入理解java泛型

前言

什么是泛型

泛型是Java SE5的新特性,泛型的提出是为了编写重用性高的代码。在《Java核心技术》中,泛型的定义为:

"泛型"意味着编写的代码可以被不同类型的对象所重用。

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。比如我们定义一个类属性或者实例属性时,往往要指定具体的类型,如Integer、Person等等, 但是如果使用了泛型,我们把这些具体的类型参数化,用一个广泛的可以表示所有类型的"类型"T来定义,那这个T就是泛型的表示。

为什么要引入泛型

在引入泛型之前,想要实现一个通用的,可以处理不同类型的方法,需要使用Object作为属性和方法参数。

比如这样:

public class Generic{
    private Object[] mData;

    public Generic(int capacity){
        mData = new Object[capacity];
    }

    public Object getData(int index){
        return mData[index];
    }

    public void add(int index, Object item){
        mData[index] = item;
    }

}

它使用一个Object数组来保存数据,这样在使用时可以添加不同类型的对象。

Generic generic = new Generic(10);
generic.add(0,"jieshou");
generic.add(1,2);

然而由于Object是所有类的父类,所有的类都可以作为成员被添加到上述类当中。当需要使用的时候,必须进行强制类型转换,而且这个强转可能会出现异常:

String item1 = (String) generic.getData(0);
String item2 = (String) generic.getData(1);

//报错

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at net.sxkeji.shixinandroiddemo2.test.generic.GenericTest.getData(GenericTest.java:46)

可以看到,使用Object来实现通用、不同类型的处理,有两个缺点:

  • 每次在使用时都需要强制转换成对应的类型
  • 在编译时编译器并不知道类型转换是否正常,运行时才会知道,并不安全

引入泛型的主要目标

有以下几点:

  1. 类型安全
  • 泛型的主要目标是提高Java程序的类型安全
  • 编译时期就可以检查出因Java类型不正确导致的ClassCastException异常
  • 符合越早出错代价越小
  1. 消除强制类型转换
  • 泛型在使用时可以直接得到目标类型,从而消除强制类型转换
  • 使得代码可读性变高,减少出错机会
  1. 潜在的性能收益
  • 支持泛型几乎不需要JVM或类文件更改
  • 所有工作都要在编译器中完成
  • 编译器生成的代码跟不使用泛型时所写的代码几乎一致,只是更能确保类型安全而已

泛型的使用方式

泛型的本质是参数化类型,类型参数的意义是告诉编译器是这个集合中要存放实例的类型,从而在添加其他类型时做出提示,在编译期间就为类型安全做了保证。

这种参数类型可以用在类、接口、方法的创建中,分别被称为泛型类、泛型接口、泛型方法。

posted @ 2021-03-13 16:47  皆守  阅读(74)  评论(0)    收藏  举报