使用Java的小伙伴,对于Java的一些高级特性一定再熟悉不过了,例如集合、反射、泛型、注解等等,这些可以说我们在平时开发中是经常使用到的,尤其是集合,基本是只要写代码没有用不到的,今天我们先来谈谈泛型。
1.定义
在了解一个事物之前,我们必定要先知道他的定义,所以我们就从定义开始,去一步一步揭开泛型的神秘面纱。
#泛型(generics)他是JDK5中引入的一个新特性,泛型提供了编译时类型安全监测机制,该机制允许我们在编译时检测到非法的类型数据结构。泛型的本质就是参数化类型,也就是所操作的数据类型被指定为一个参数#常见的泛型的类型表示上面的T仅仅类似一个形参的作用,名字实际上是可以任意起的,但是我们写代码总该是要讲究可读性的。常见的参数通常有:E-Element(在集合中使用,因为集合中存放的是元素)T-Type(表示Java类,包括基本的类和我们自定义的类)K-Key(表示键,比如Map中的key)V-Value(表示值)?-(表示不确定的java类型)但是泛型的参数只能是类类型,不能是基本的数据类型,他的类型一定是自Object的
注意:泛型不接受基本数据类型,换句话说,只有引用类型才能作为泛型方法的实际参数
2.为什么要使用泛型?
说到为什么要使用,那肯定是找一大堆能说服自己的优点啊。
#泛型的引入,是java语言的来讲是一个较大的功能增强。同时对于编译器也带来了一定的增强,为了支持泛型,java的类库都做相应的修改以支持泛型的特性。(科普:实际上java泛型并不是jdk5(发布了jdk5)才提出来的,早在年的时候,泛型机制就是java最早的规范之一)
另外,泛型还具有以下的优点:
#1.提交了java的类型安全泛型在很大程度上来提高了java的程序安全。例如在没有泛型的情况下,很容易将字符串转成Integer类型的亦或者Integer转成String,而这样的错误是在编译期无法检测。而使用泛型,则能很好的避免这样的情况发生。#2.不需要烦人的强制类型转换泛型之所以能够消除强制类型转换,那是因为程序员在开发的时候就已经明确了自己使用的具体类型,这不但提高了代码的可读性,同样增加了代码的健壮性。#提高了代码的重用性泛型的程序设计,意味着编写的代码可以被很多不同类型的对象所重用
在泛型规范正式发布之前,泛型的程序设计是通过继承来实现的,但是这样子有两个严重的问题:
①取值的时候需要强制类型转换,否则拿到的都是Object
②编译期不会有错误检查
我们来看下这两个错误的产生
2.1编译期不会有错误检查
publicclassDonCheckInCompile{publicstaticvoidmain(String[]args){Listlist=newArrayList();list.add("a");list.add(3);System.out.println(list);}}
程序不但不会报错,还能正常输出
2.2强制类型转换
publicclassDonCheckInCompile{publicstaticvoidmain(String[]args){Listlist=newArrayList();list.add("a");list.add(3);for(Objectost){System.out.println((String)o);}}}
因为你并不知道实际集合中的元素到底是哪些类型的,所以在使用的时候也是不确定的,如果在强转的时候,那必然会带来意想不到的错误,这样潜在的问题就好像是定时炸弹,肯定是不允许发生的。所以这就更体现了泛型的重要性。
3.泛型方法
在java中,泛型方法可以使用在成员方法、构造方法和静态方法中。语法如下:
public申明泛型的类型类型参数fun();如publicTTfun(Tt);这里的T表示一个泛型类型,而T表示我们定义了一个类型为T的类型,这样的T类型就可以直接使用了,且T需要放在方法的返回值类型之前。T即在申明的时候是不知道具体的类型的,只有的使用的时候才能明确其类型,T不是一个类,但是可以当作是一种类型来使用。
下面来通过具体的例子来解释说明,以下代码将数组中的指定的两个下标位置的元素进行交换(不要去