对于java的泛型我一直属于一知半解的,平常真心用的不多。直到阅读《Effect Java》,看到很多平常不了解的用法,才下定决心,需要系统的学习,并且记录下来。
1、泛型的概述:
1.1 泛型的由来
根据《Java编程思想》中的描述,泛型出现的动机:
有很多原因促成了泛型的出现,而最引人注意的一个原因,就是为了创建容器类。
泛型的思想很早就存在,如C++中的模板(Templates)。模板的精神:参数化类型
1.2 基本概述
- 泛型的本质就是"参数化类型"。一提到参数,最熟悉的就是定义方法的时候需要形参,调用方法的时候,需要传递实参。那"参数化类型"就是将原来具体的类型参数化
- 泛型的出现避免了强转的操作,在编译器完成类型转化,也就避免了运行的错误。
1.3 泛型的目的
Java泛型也是一种语法糖,在编译阶段完成类型的转换的工作,避免在运行时强制类型转换而出现ClassCastException,类型转化异常。
1.4 实例
JDK 1.5时增加了泛型,在很大的程度上方便在集合上的使用。
不使用泛型:
- public static void main(String[] args) {
- List list = new ArrayList();
- list.add(11);
- list.add("ssss");
- for (int i = 0; i < list.size(); i++) {
- System.out.println((String)list.get(i));
- }
- }
因为list类型是Object。所以int,String类型的数据都是可以放入的,也是都可以取出的。但是上述的代码,运行的时候就会抛出类型转化异常,这个相信大家都能明白。
使用泛型:
- public static void main(String[] args) {
- List<String> list = new ArrayList();
- list.add("hahah");
- list.add("ssss");
- for (int i = 0; i < list.size(); i++) {
- System.out.println((String)list.get(i));
- }
- }
在上述的实例中,我们只能添加String类型的数据,否则编译器会报错。
2、泛型的使用
泛型的三种使用方式:泛型类,泛型方法,泛型接口
2.1 泛型类
泛型类概述:把泛型定义在类上
定义格式:
- public class 类名 <泛型类型1,...> {
-
- }
注意事项:泛型类型必须是引用类型(非基本数据类型)
2.2 泛型方法
泛型方法概述:把泛型定义在方法上
定义格式:
public <泛型类型> 返回类型 方法名(泛型类型 变量名) { }
注意要点:
方法声明中定义的形参只能在该方法里使用,而接口、类声明中定义的类型形参则可以在整个接口、类中使用。当调用fun()方法时,根据传入的实际对象,编译器就会判断出类型形参T所代表的实际类型。
- class Demo{
- public <T> T fun(T t){ // 可以接收任意类型的数据
- return t ; // 直接把参数返回
- }
- };
- public class GenericsDemo26{
- public static void main(String args[]){
- Demo d = new Demo() ; // 实例化Demo对象
- String str = d.fun("汤姆") ; // 传递字符串
- int i = d.fun(30) ; // 传递数字,自动装箱
- System.out.println(str) ; // 输出内容
- System.out.println(i) ; // 输出内容
- }
- };
2.3 泛型接口
泛型接口概述:把泛型定义在接口
定义格式:
- public interface 接口名<泛型类型> {
-
- }
实例:
- /**
- * 泛型接口的定义格式: 修饰符 interface 接口名<数据类型> {}
- */
- public interface Inter<T> {
- public abstract void show(T t) ;
- }
- /**
- * 子类是泛型类
- */
- public class InterImpl<E> implements Inter<E> {
- @Override
- public void show(E t) {
- System.out.println(t);
- }
- }
- Inter<String> inter = new InterImpl<String>() ;
- inter.show("hello") ;
(编辑:ASP站长网)
|