浅谈泛型

Java中存在泛型,使用泛型有一个好处,就是可以避免我们再进行繁杂的类型强制转换。在这里先举个例子,平时我们用到的List集合,我们可以把各种类型的对象放进去。在取出的时候,我们可以使用类型强制转换。当这个集合中存储的都是一种类型的元素的时候,是没有问题的,但是在集合中的类有这个也有那个的时候,一种强制类型转换不能使所有的都奏效,而且这样编写在编译期不会出现问题,却在运行时强制转化失败,报出ClassCastException错误。因为在把对象放入集合的时候,集合不会记住这个对象的类型,在编译时认成Object类型,但是在运行时对象类型却是它本身。

在定义域的时候使用泛型,可以提前告知编译器这个域里储存的就是这种类型的值,如果再试图使用强制转换,编译器就会报错。这样做也可以在编译器就预防把错误的类型存储到域中,会造成编译报错。如果编译期没有报错,那么这样也可以确保运行时不会报错。这就是泛型的好处。

下面是具体的泛型使用方法。比如在定义集合时使用List来定义,通过阅读源码可以看到,接口中的add和get方法都是返回的E,在这里也就是String了。因此,这时再试图向List中加入一个Integer时就会出现对象类型编译错误。

下面更深入一步。加入我们自己创建了一个泛型类,并生成了两个不同的类实例,也就是传入的泛型实参不相同。但是这时候通过测试我们会看到,这两个类实际都还是原来最基本的类,是相同的。这是什么原因呢?因为Java对泛型的概念只停留在编译器阶段,在编译为.class文件后,已经把泛型的信息正确检验了出来,这时就会将泛型的信息擦除掉,成功编译之后的.class文件中不会包含任何的泛型信息,也就是说泛型信息不会进入到运行阶段。

泛型中还有一种使用方法就是类型通配符。这里包含两种,分别是类型通配符上限和类型通配符下限。比如我们定义一个方法,对类型的实参有一个进一步的限制,这时候就用Box<? extends Number>来做形参类型。这样就只能接受Number类及其子类。反之,则用? super Number

总而言之,泛型,最重要的还是要了解Java的目的,其中的思想。

参考:Java总结篇系列:Java泛型

猜你喜欢

转载自blog.csdn.net/fengchi863/article/details/80057222