java中的泛型的使用与理解
什么是泛型?
泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写 体验泛型
代码时定义一些可变部份,那些部份在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。
定义:
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
泛型的好处:
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
3、泛型的类型参数可以有多个。
4、泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上称为“有界类型”。
5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName("java.lang.String");
注意:
- 泛型是 Java 1.5 的新增特性,它以C++模板为参照,本质是参数化类型(Parameterized Type)的应用。
- 类型参数只能用来表示引用类型,泛型在Java中要求,泛型传入的必须是包装类型,必须是Object类型的,或者是自定义的类,不能传入基本类型例如 int、double、char 等。,必须要传包装类型如Integer不能用来表示基本类型,但是传递基本类型不会报错,因为它们会自动装箱成对应的包装类。
运用:
1 /*iG相当于占位符,用来传递数据类型,而不是数据的值,称为类型参数(名字可以自定义,当然更多的时候我们得按照规范来) 2 * 3 */ 4 //自定义泛型类,多个泛型之间可以用逗号隔开如<iG,iT,..> 5 class MyArrays<iG>{ //类的泛型必须要放在类名的后面 6 //调换数组的元素的位置 7 public void rever(iG[] a){ 8 System.out.println(a); 9 } 10 } 11 public class customToolClass { 12 public static void main(String[] args){ 13 String[] str=new String[10]; 14 Integer[] intArr = new Integer[10]; 15 //不能传基本数据类型,就算是整形数组,如int[],也要传int的包装类Integer 16 int[] arr = new int[10]; 17 // MyArrays<int> my1 = new MyArray<int>(); //不能是基本数据类型 18 MyArrays<Integer> my2 = new MyArrays<Integer>(); // 只能是包装类 19 //my2.rever(arr); //不能是整形数组 20 //标准格式是这样的,两边的类型要匹配 21 MyArrays<String> aa = new MyArrays<String>(); 22 aa.rever(str); 23 //下面这两种也是可以的,但是不推荐,这是java为了向下兼容以前的版本设计的 24 MyArrays<String> cc = new MyArrays(); 25 MyArrays dd = new MyArrays<String>(); 26 //-------------------------------------------------------------- 27 MyArrays<Integer> aa1 = new MyArrays<Integer>(); 28 aa1.rever(intArr); 29 } 30 }
与普通类的定义相比,上面的代码在类名后面多出了 <iG> ,iG 是自定义的标识符,也是参数,用来传递数据的类型,而不是数据的值,我们称之为类型参数。在泛型中,不但数据的值可以通过参数传递,数据的类型也可以通过参数传递。iG只是数据类型的占位符,运行时会被替换为真正的数据类型。
传值参数(我们通常所说的参数)由小括号包围,如 (int x, double y),类型参数(泛型参数)由尖括号包围,多个参数由逗号分隔,如 <T> 或 <T, E>。注意:这只是个规范,名称可以自定义的。
类型参数需要在类名后面给出。一旦给出了类型参数,就可以在类中使用了。类型参数必须是一个合法的标识符,习惯上使用单个大写字母,通常情况下,K 表示键,V 表示值,E 表示异常或错误,T 表示一般意义上的数据类型。
泛型类在实例化时必须指出具体的类型,也就是向类型参数传值,格式为:
className variable<dataType1, dataType2> = new className<dataType1, dataType2>();
也可以省略等号右边的数据类型,但是会产生警告,即:
className variable<dataType1, dataType2> = new className();
因为在使用泛型类时指明了数据类型,赋给其他类型的值会抛出异常,既不需要向下转型,也没有潜在的风险,比本文一开始介绍的自动装箱和向上转型要更加实用。
测试效果图:
转载于:https://www.cnblogs.com/qq1871707128/p/6118156.html
java中的泛型的使用与理解相关推荐
- Java中的泛型 --- Java 编程思想
前言 我一直都认为泛型是程序语言设计中一个非常基础,重要的概念,Java 中的泛型到底是怎么样的,为什么会有泛型,泛型怎么发展出来的.通透理解泛型是学好基础里面中非常重要的.于是,我对<Ja ...
- java定义list_我的Java Web之路59 - Java中的泛型
本系列文章旨在记录和总结自己在Java Web开发之路上的知识点.经验.问题和思考,希望能帮助更多(Java)码农和想成为(Java)码农的人. 目录 介绍 再谈Java中的类型 为什么需要泛型? J ...
- [转载] 详解Java中的泛型
参考链接: Java中具有泛型的有界类型 1.什么是泛型 泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参.那么参数化类型怎么理解呢?顾名 ...
- java如何用反射把具体方法抽象_如何在Java 中使用泛型或反射机制对DAO进行抽象...
如何在Java 中使用泛型或反射机制对DAO进行抽象 发布时间:2020-11-26 16:07:42 来源:亿速云 阅读:80 作者:Leah 本篇文章为大家展示了如何在Java 中使用泛型或反射机 ...
- Java中的泛型全解析(一)
为什么我们需要泛型? 通过两段代码我们就可以知道为何我们需要泛型 实际开发中,经常有数值类型求和的需求,例如实现int类型的加法, 有时候还需要实现long类型的求和, 如果还需要double类型的求 ...
- Java 中的泛型(两万字超全详解)
文章目录 前言 一.泛型概述 1. 什么是泛型?为什么要使用泛型? 2. 泛型使用场景 3. 泛型概述小结 二.泛型类 1. 泛型类的定义 2. 泛型类的使用 三.泛型接口 四.泛型方法 1. 泛型方 ...
- Java中创建泛型数组
Java中创建泛型数组 使用泛型时,我想很多人肯定尝试过如下的代码,去创建一个泛型数组 T[] array = new T[]; 当我们写出这样的代码时编译器会报Cannot create a gen ...
- 【笔记】JAVA中的泛型和反射
泛型 Java的泛型是如何工作的?什么是类型擦除? ----泛型是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息.例如List在运行时仅用一个Lis ...
- java中的泛型(E)
java中的泛型(E) 泛型:就是一种不确定的数据类型. 比如:ArrayList E就是泛型. 这种不确定的数据类型需要在使用这个类的时候才能够确定出来. 泛型可以省略,如果省略,默认泛型是Obje ...
最新文章
- “复制粘贴”发明人,竟是物理学博士转行做程序媛!
- Unicode 转换 ASCII,ASCII 转换 Unicode 在线网站工具
- 流程的python-《流畅的 Python》到底好在哪?
- Python基础类型之元组
- Web Api如何传递POST请求
- 如何在内核里面查找某些结构体或者宏的定义
- ModelSim 使用笔记1
- rm: cannot remove directory `test': Permission denied
- uniapp点击图片放大_想要放大镜将图片放大的效果?你只需这么做即可!
- 【原创】Performanced C++ 经验规则 第五条:再谈重载、覆盖和隐藏
- 使用 Shell (命令备忘)
- 基于stc15f2k60s2芯片单片机编程(可调时钟)
- 端游一般用什么配置的服务器呢?
- 有道云笔记分享_有道云笔记
- 你好Linux!第一篇——Linux的前世今生和应用
- 18-09-20 关于Xlrd和Xlwt的初步学习
- Real-Time Rendering Chapter 1~6 读书笔记
- Python异步并发机制详解,让你的代码运行效率就像搭上了火箭!!!
- 南卡和OPPO蓝牙耳机哪个更好?高性价比蓝牙耳机评测
- note2刷 android 5.0.2,三星Galaxy Note Pro 12.2 Android 5.0.2更新锁定了竞争对手的键盘