泛型
1、泛型的概述
在JDK1.5之前,把对象放入到集合中,集合不会记住元素的类型,取出时,全都变成Object类型。
泛型是jdk5引入的类型机制,就是将类型参数化,它是早在1999年就制定的jsr14的实现。泛型机制将类型转换时的类型检查从运行时提前到了编译时,
使用泛型编写的代码比杂乱的使用object并在需要时再强制类型转换的机制具有更好的可读性和安全性。
例如在集合接口中,集合类中出现的<>就是泛型,即参数化类型 ,<>中的字母代表的是类型。
泛型程序设计意味着程序可以被不同类型的对象重用。
- 可读性,从字面上就可以判断集合中的内容类型;
- 类型检查,避免插入非法类型。
- 获取数据时不在需要强制类型转换
总之:
泛型(Generics)是把类型参数化,运用于类、接口、方法中,可以通过执行泛型类型调用分配一个类型,将用分配的具体类型替换泛型类型。
然后,所分配的类型将用于限制容器内使用的值,这样就无需进行类型转换,还可以在编译时提供更强的类型检查。
2、泛型的使用标准
类型参数(又称类型变量)用作占位符,指示在运行时为类分配类型。
根据需要,可能有一个或多个类型参数,并且可以用于整个类。
根据惯例,类型参数是单个大写字母,该字母用于指示所定义的参数类型。下面列出每个用例的标准类型参数:
3、泛型类
在类上添加一个类型的定义,在使用类时指定一个类型,就可以对传入的数据进行类型检查,
在取出时,不必进行类型转换了,这样的类就是泛型类。
泛型类的缺点:
每次针对不同的类型的参数,都必须创建不同类型的对象,这使得方法依赖于创建对象时的类型,它们之间的耦合度太高了。
为了降低这种耦合度,可以把泛型定义在方法上,这就是泛型方法。
4、泛型方法
泛型类的问题:带泛型参数的方法,和对象的类型耦合度太高.
泛型方法:把泛型直接定义在方法上.调用方法的时候,确定参数的类型
修饰符 <T> 返回值类型 方法名(){
}
严格的调用方式:
对象.<T>method()
一般情况下调用时可以省略:
对象.method()
5、泛型方法和泛型类混用看归属
泛型方法有自己的类型参数,泛型类的成员方法使用的是当前类的类型参数。
方法中有<T> 是泛型方法;没有的,称为泛型类中的成员方法。
package wang; class Clazz1<E>{ public void test1(E e){ System.out.println(e.getClass()); } public <E> void test2(E e){ System.out.println(e.getClass()); } public <T> void test3(T e){ System.out.println(e.getClass()); } public <T> void test4(E e){ System.out.println(e.getClass()); } } public class GenericDemo4 { public static void main(String[] args) { Clazz1<String> clazz1=new Clazz1<>(); clazz1.test1(1); clazz1.test2(1); clazz1.test3(1); clazz1.test4(1); } }