设为首页 - 加入收藏 平凉站长网 (http://www.0933zz.com)- 国内知名站长资讯网站,提供最新最全的站长资讯,创业经验,网站建设等!
热搜: 什么 为什么 平台
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

聊一聊Java 泛型全解

发布时间:2019-08-29 23:16 所属栏目:[优化] 来源:来一杯82年的Java
导读:对于java的泛型我一直属于一知半解的,平常真心用的不多。直到阅读《Effect Java》,看到很多平常不了解的用法,才下定决心,需要系统的学习,并且记录下来。 1、泛型的概述: 1.1 泛型的由来 根据《Java编程思想》中的描述,泛型出现的动机: 有很多原因促

对于java的泛型我一直属于一知半解的,平常真心用的不多。直到阅读《Effect Java》,看到很多平常不了解的用法,才下定决心,需要系统的学习,并且记录下来。

聊一聊Java 泛型全解

1、泛型的概述:

1.1 泛型的由来

根据《Java编程思想》中的描述,泛型出现的动机:

有很多原因促成了泛型的出现,而最引人注意的一个原因,就是为了创建容器类。

泛型的思想很早就存在,如C++中的模板(Templates)。模板的精神:参数化类型

1.2 基本概述

  • 泛型的本质就是"参数化类型"。一提到参数,最熟悉的就是定义方法的时候需要形参,调用方法的时候,需要传递实参。那"参数化类型"就是将原来具体的类型参数化
  • 泛型的出现避免了强转的操作,在编译器完成类型转化,也就避免了运行的错误。

1.3 泛型的目的

Java泛型也是一种语法糖,在编译阶段完成类型的转换的工作,避免在运行时强制类型转换而出现ClassCastException,类型转化异常。

1.4 实例

JDK 1.5时增加了泛型,在很大的程度上方便在集合上的使用。

不使用泛型:

  1. public?static?void?main(String[]?args)?{?
  2. ?List?list?=?new?ArrayList();?
  3. ?list.add(11);?
  4. ?list.add("ssss");?
  5. ?for?(int?i?=?0;?i?
  6. ?System.out.println((String)list.get(i));?
  7. ?}?
  8. ?}?

因为list类型是Object。所以int,String类型的数据都是可以放入的,也是都可以取出的。但是上述的代码,运行的时候就会抛出类型转化异常,这个相信大家都能明白。

使用泛型:

  1. public?static?void?main(String[]?args)?{?
  2. ?List?list?=?new?ArrayList();?
  3. ?list.add("hahah");?
  4. ?list.add("ssss");?
  5. ?for?(int?i?=?0;?i?
  6. ?System.out.println((String)list.get(i));?
  7. ?}?
  8. ?}?

在上述的实例中,我们只能添加String类型的数据,否则编译器会报错。

2、泛型的使用

泛型的三种使用方式:泛型类,泛型方法,泛型接口

2.1 泛型类

泛型类概述:把泛型定义在类上

定义格式:

  1. public?class?类名?<泛型类型1,...>?{?
  2. ??
  3. }?

注意事项:泛型类型必须是引用类型(非基本数据类型)

2.2 泛型方法

泛型方法概述:把泛型定义在方法上

定义格式:

public <泛型类型> 返回类型 方法名(泛型类型 变量名) { }

注意要点:

方法声明中定义的形参只能在该方法里使用,而接口、类声明中定义的类型形参则可以在整个接口、类中使用。当调用fun()方法时,根据传入的实际对象,编译器就会判断出类型形参T所代表的实际类型。

  1. class?Demo{??
  2. ?public??T?fun(T?t){?//?可以接收任意类型的数据??
  3. ?return?t?;?//?直接把参数返回??
  4. ?}??
  5. };??
  6. public?class?GenericsDemo26{??
  7. ?public?static?void?main(String?args[]){??
  8. ?Demo?d?=?new?Demo()?;?//?实例化Demo对象??
  9. ?String?str?=?d.fun("汤姆")?;?//?传递字符串??
  10. ?int?i?=?d.fun(30)?;?//?传递数字,自动装箱??
  11. ?System.out.println(str)?;?//?输出内容??
  12. ?System.out.println(i)?;?//?输出内容??
  13. ?}??
  14. };?

2.3 泛型接口

泛型接口概述:把泛型定义在接口

定义格式:

  1. public?interface?接口名<泛型类型>?{?
  2. ??
  3. }?

实例:

  1. /**?
  2. ?*?泛型接口的定义格式:?修饰符?interface?接口名<数据类型>?{}?
  3. ?*/?
  4. public?interface?Inter?{?
  5. ?public?abstract?void?show(T?t)?;?
  6. }?
  7. /**?
  8. ?*?子类是泛型类?
  9. ?*/?
  10. public?class?InterImpl?implements?Inter?{?
  11. ?@Override?
  12. ?public?void?show(E?t)?{?
  13. ?System.out.println(t);?
  14. ?}?
  15. }?
  16. Inter?inter?=?new?InterImpl()?;?
  17. inter.show("hello")?;?

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章