之前介绍集合时,可以看到有List<String>这样的写法,那么尖括号里的内容是什么呢?这是泛型,意思就是说声明的这个List集合只能存放String类型的元素。

泛型是什么?

‘泛’指一般、不深入,在这里可以认为是不确定、可变的意思,java中允许定义一些不确定的类型,不可以是基本数据类型,但是在编译时期一定要给与这些不确定类型一个确定的类型,这就是泛型,使用泛型可以提高代码复用的效率。之前听过一个小故事,两个项目经理争论接口中方法应该返回什么类型才合适,争论好久都没有结果,这时架构师过来说了句:“用泛型”,使得问题迎刃而解。泛型在java编程中还是很重要的。

为什么要用泛型?

一切为了方便和提高效率。当不确定要选择何种类型时可以使用泛型,当使用到时再确定类型即可,另外使用泛型可以使得接口复用率提高,例如:List集合,List用到了泛型:List<E>,这样便可以使得集合可以任意存储各个类型的对象,使得List接口高度复用,可以假设一个场景,如果List没有使用泛型,那么集合中存储的数据就会五花八门,非常混乱,如果每存储一种类型就去创建一个对应的List集合类,那么这是不可能的,而使用了泛型则这些问题统统被优雅的解决了。

泛型的特性?

一定要知道泛型只能在编译时期使用,并且一定要在程序运行之前给予泛型类型一个确定的类型。

泛型怎么用?

泛型可以在接口、类和方法上使用,用于标记一个不确定的参数类型。接下来使用代码来介绍泛型如何使用:

泛型接口和泛型类的使用(实例化时最好时确定类型):

package com.czp.generic;
//可以这样实现,此时实现类上必须也要加上泛型
public class SelfInterfaceImpl<T> implements SelfInterface<T>{T t;@Overridepublic T getObject(int i) {return t;}
}class Test{public static void main(String[] args) {//当创建带有泛型参数的对象时,如果还不确定泛型的具体类型,则一概为Object类型;实例化时一定要确定类型SelfInterface selfInterface = new SelfInterfaceImpl<>();Object object = selfInterface.getObject(1);//返回为Object型//确定泛型类型为StringSelfInterface<String> selfInterface2 = new SelfInterfaceImpl<>();String string = selfInterface2.getObject(1);//返回为定义的类型//确定泛型类型为IntegerSelfInterface<Integer> selfInterface3 = new SelfInterfaceImpl<>();Integer integer = selfInterface3.getObject(1);//返回为定义的类型}}

泛型方法的使用:

public class SelfMethodTest {public static void main(String[] args) throws InstantiationException, IllegalAccessException {SelfMethodTest test = new SelfMethodTest();Object name = test.getName(ArrayList.class);String []s = {"111","222","333","444"};test.showThings(s);}//使用<T>来定义泛型方法//这里想来想去也只有反射这里用的泛型方法比较好,根据传入的运行时类对象确定类public <T> T getName(Class c) throws InstantiationException, IllegalAccessException {T t = (T)c.newInstance();if (t.getClass().isAssignableFrom(ArrayList.class)) {System.out.println("类型符合");}return t;}//这里顺便说一下可变参数,当传入的形参太多时,则可以使用一个数组进行传参,但是呢,样式做了改变 int ...i 表示的是传入一个int类型的数组i作为形参//有的时候不能确定参数的类型,可以使用泛型,如下public void showThings(int ...i) {}//此时是泛型数组,所以传参数时,数组一定要确定类型public <T> void showThings(T ...t) {for (T tt : t) {System.out.println(tt);}}
}

有的时候会看到如下这种方式的泛型的表示:

public void showThings(List<?> list)

public void showThings(List<? extends Map> list)

那么这里的问号是什么呢?我们把问号叫做通配符。List<?> list 表示可以接受任何类型的List集合,而List<? extends Map> list 则表示只能接受继承或者实现了了Map接口的接口或类。有的时候就是想要限制传入的参数的类型,例如:我就想接受一个Map或者Map扩展类的参数,其余的不想接收,这时候就可以使用<? extends Map>这种形式进行声明;还有一种时<? super Map> ,他表示的是必须是Map或者Map的父级接口类型。

18、java中的泛型相关推荐

  1. Java中创建泛型数组

    Java中创建泛型数组 使用泛型时,我想很多人肯定尝试过如下的代码,去创建一个泛型数组 T[] array = new T[]; 当我们写出这样的代码时编译器会报Cannot create a gen ...

  2. Java中的泛型 --- Java 编程思想

    前言 ​ 我一直都认为泛型是程序语言设计中一个非常基础,重要的概念,Java 中的泛型到底是怎么样的,为什么会有泛型,泛型怎么发展出来的.通透理解泛型是学好基础里面中非常重要的.于是,我对<Ja ...

  3. 【笔记】JAVA中的泛型和反射

    泛型 Java的泛型是如何工作的?什么是类型擦除? ----泛型是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息.例如List在运行时仅用一个Lis ...

  4. java定义list_我的Java Web之路59 - Java中的泛型

    本系列文章旨在记录和总结自己在Java Web开发之路上的知识点.经验.问题和思考,希望能帮助更多(Java)码农和想成为(Java)码农的人. 目录 介绍 再谈Java中的类型 为什么需要泛型? J ...

  5. [转载] 详解Java中的泛型

    参考链接: Java中具有泛型的有界类型 1.什么是泛型 泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参.那么参数化类型怎么理解呢?顾名 ...

  6. java中的泛型(E)

    java中的泛型(E) 泛型:就是一种不确定的数据类型. 比如:ArrayList E就是泛型. 这种不确定的数据类型需要在使用这个类的时候才能够确定出来. 泛型可以省略,如果省略,默认泛型是Obje ...

  7. java如何用反射把具体方法抽象_如何在Java 中使用泛型或反射机制对DAO进行抽象...

    如何在Java 中使用泛型或反射机制对DAO进行抽象 发布时间:2020-11-26 16:07:42 来源:亿速云 阅读:80 作者:Leah 本篇文章为大家展示了如何在Java 中使用泛型或反射机 ...

  8. Java中的泛型全解析(二)

    Java中的泛型全解析(一) 泛型中的约束和局限性 现在我们有泛型类 不能用基本类型实例化类型参数 运行时类型查询只适用于原始类型 泛型类的静态上下文中类型变量失效 不能在静态域或方法中引用类型变量. ...

  9. Java中的泛型全解析(一)

    为什么我们需要泛型? 通过两段代码我们就可以知道为何我们需要泛型 实际开发中,经常有数值类型求和的需求,例如实现int类型的加法, 有时候还需要实现long类型的求和, 如果还需要double类型的求 ...

  10. Java 中的泛型是什么,它有什么作用?(十五)

    Java中的泛型是一种类型参数化机制,它使代码更具可读性.可重用性和稳健性.在Java中,通过使用泛型,可以将类型作为参数传递给类或方法,并在编译时执行类型检查,从而避免许多运行时错误. 泛型的基础 ...

最新文章

  1. java和python哪个好就业2020-java和python哪个未来发展比较好?
  2. linux安装redis服务,配置PHP扩展
  3. js继承的实现(转载)
  4. centos安装python3小白_在Linux CentOS7 下安装 python3
  5. ios nstimer实现延时_IOS_IOS开发代码分享之用nstimer实现倒计时功能,用nstimer实现倒计时功能,废话 - phpStudy...
  6. [每日短篇] E - Base64 编码
  7. UVA - 101:The Blocks Problem
  8. serverless 构建_使用Serverless,StepFunctions和StackStorm Exchange构建社区注册应用程序-Episode…...
  9. websocket底层处理粘包_Socket解决粘包问题1
  10. 穷举法求最大公共子序列C语言,算法--最长公共子序列(LongestCommon Subsequence, LCS)...
  11. C# 执行文件的根目录 (转)
  12. net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第二章 入门篇-快速入门ASP.NET Core看这篇就够了...
  13. SpringMvc @PathVariable 工作原理
  14. 发送短信工具类(亿美短信平台接口)
  15. springboot之整合slf4j
  16. phpstorm 报 expecting statement
  17. 用EFS加密文件的方法
  18. Qmail+Mini Howto
  19. AVI文件和AVI函数
  20. java成果_java学习成果1 - chenxiao60的个人空间 - OSCHINA - 中文开源技术交流社区

热门文章

  1. java的scanner的方法_Java Scanner reset()方法
  2. vs里面mfc是什么_最近!一大批人正在前往文安,究竟发生了什么?
  3. 数据结构——哈弗曼编码问题
  4. leetcode53. 最大子数组和(动态规划)
  5. leetcode213. 打家劫舍 II
  6. AcWing 499. 聪明的质监员
  7. icoding复习6 图
  8. 伦斯勒理工大学计算机专业好申请吗,2020年伦斯勒理工学院申请难度
  9. Java开发Web Service的几种解决方案
  10. Java实现生产消费模型的5种方式