最近在学习设计模式相关知识,对泛型相关知识进行总结!!!
1. 为什么要有泛型?
在不使用泛型的时候,比如ArrayList,存储的是Object类型的数据。虽然我们在使用的时候可以强制类型转换,但是如果出现错误,就很严重。
因为,强制类型转换要求程序员明确知道实际参数的引用类型,强制类型转换出现的错误是运行期异常,在编译器无法识别这种错误,只有在运行期检测这种错误。在生产环境中,这种情况就很危险。
那什么是泛型
泛型是JDK1.5引入的新特性,泛型的本质是参数化类型,泛型提供了编译时类型的安全检测机制,该机制允许程序在编译时检测非法的类型,比如要实现一个能够对String、Int、Float、Object进行大小比较的方法,就可以使用泛型。
泛型的好处
- 类型安全
- 消除了强制类型的转换
泛型的类型
- E - Element: 在集合中使用,因为集合中存放的是元素
- T - Type:表示Java 类,包括基本的类和我们自定义的类
- K - Key:表示键,比如Map中的key
- V - Value:表示值
- N - Number:表示数值类型
- ?- :表示不确定的java类型
2.泛型方法
泛型方法指将方法的参数类型定义为泛型,以便在调用时接收不同类型的参数。
语法:
修饰符 <T, E, ...> 返回值类型 方法名 (形参列表) {
//do somethong
}
其中,< T >表示声明此方法为泛型方法,只有声明了< T >的方法才是泛型方法。
举例:
public static <T,E,K> void printType(T t, E e, K k) {
//do something
}
泛型的具体类型,在调用方法时指定
3.泛型类、接口
泛型类
泛型类是指在定义类时在类上定义了泛型
public class GeneralClass 就定义了一个泛型类
怎么使用?
类名<具体的数据类型> 对象名 = new 类名<具体的数据类型>();
ArrayList< String > list = new ArrayList();
注:在Java1.7以后,后面的<>中的具体的数据类型可以省略不写
比如,ArrayList< String > list = new ArrayList<>();
泛型接口
泛型接口的声明和泛型类的声明类似,通过在接口后面添加类型参数的声明部分来实现。泛型类型的具体类型一般在实体类中进行声明,不同类型的实现类处理不同的业务逻辑。
//定义一个泛型接口
public interface IGeneral<T> {
public T getId();
}
//定义泛型接口的实现类
public class GeneralIntegerImpl implements IGeneral<Integer> {
@Override
public Integer getId() {
//do something
}
}
注:泛型类中的成员方法不能被定义为static