JAVA集合中泛型的原理本质简介

标签: JAVA

Java集合中的泛型机制

集合中之所以可以存放不同类型的数据是因为全部当作Object类型处理的,当从集合中取出元素并希望表达该数据最原始的类型时就需要进行强制类型转换,强制类型转换不仅使得代码更加繁琐而且可能导致类型转换异常的发生.

为了避免上述问题的发生,从jdk1.5开始提供泛型机制,也就是在集合名称的右边使用<数据类型>的方式明确规定该集合中可以存放的元素类型,若存放其他类型则会报错,数据类型可以随便写,可以是java自带的也可以是我们创建的,但两边必须保持一致。

如:

List<Integer> l1 = new LinkedList<Integer>();

在实际开发过程中,我们可能用到Java多态的机制,左边放一个Person,那么右边Person的子类都可以,如

List<Person> l1 = new LinkedList<Student>();
List<Person> l1 = new LinkedList<Teacher>();

 

例:用泛型机机制来声明集合

package com.xxx.xxx
	import java.util.LinkedList;
	import java.util.List;
	import xdl.person.Student;
	
	public class TestListType {
	
		public static void main(String[] args) {
			
			// 使用泛型机制来声明集合
			List<Integer> l1 = new LinkedList<Integer>();
			// 表示l1这个集合中只支持放Integer类型的			

			// 向集合中添加元素
			l1.add(new Integer(1));
			l1.add(new Integer(2));
			l1.add(new Integer(3));
			//l1.add(new String("four")); // 编译报错
			System.out.println(l1); //[1, 2, 3]
			
			// 获取集合中下标为0的元素
			Integer it = l1.get(0);
			System.out.println("it = " + it); // it = 1
			
			System.out.println("---------------------------");
			
			List<String> l2 = new LinkedList<String>();
			// 表示l2这个集合只支持放String类型的
			
			List<Student> l3 = new LinkedList<Student>();
			// 表示l3这个集合只支持放Student类型的
		}
	
	}

 

泛型的定义

对于整个Java官方库来说,整个List<E> 只写了一个, 而这个一个接口既能处理上面的Integer、又能处理String类型、又能处理Student类型等等,于是我们把它叫做泛型(即:广泛的类型);

泛型的本质

我们看一下LinkedList源码,我们知道尖括号代表泛型,尖括号里面有个E,其实在这里E就相当于这个类的形式参数
而当我们创建对象的时候会传一个Integer或String或Person进来,这里的Integer或String或Person就相当于实际参数,把实际参数传过来给这个形式参数接收,所以这里E全部替换成Integer或String或Person,以后在使用E就代表Integer或String或Person,

这里有点类似于方法的调用,只是方法的调用传的是数值,而泛型的调用传的数据类型仅此而已,这是泛型的本质。

 

泛型的原理

泛型机制的原理就是参数化类型,也就是说使用E作为泛型机制的形式参数负责占位,当真正构造对象时需要使用真实的数据类型作为实参传递给E这个形参,从而类中的E全部变成了实参类型。

 

如何判断哪些类支持泛型,哪些类不支持泛型,怎么去判断呢?

只要看到类也好、接口也好,只要它的名字后面有尖括号,无论尖括号里面的字母是什么,就表示这个接口支持泛型,泛型的意思就是说创建对象的时候传个数据类型作为实参了。

 

一句大白话说明泛型机制就是:参数化类型。 说白了就是让数据类型作为参数传递

版权声明:本文为xyphf原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xyphf/article/details/82765031

智能推荐

php输出语句

php输出语句 常见的输出语句 echo(): 可以一次输出多个值,多个值之间用逗号分隔。echo是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用。 print(): 函数print()打印一个值(它的参数),如果字符串成功显示则返回true,否则返回false。 print_r(): 可以把字符串和数字简单地打印出来,而数组则以括起来的键和值...

工厂模式

简介 常见的实例化对象模式。 用工厂方法替代new操作的一种模式。 当我们使用new操作实例化对象时,调用构造函数完成初始化。若初始化仅是进行赋值等简单的操作,写入构造函数即可。但如果初始化时需要执行一长串复杂的代码,将多个工作装入一个方法,是不妥的。 创建实例与使用实例分离。将创建实例所需的大量初始化工作从基类的构造函数中分离出去。 简单工厂模式、工厂方法模式针对的是一个产品等级结构;而抽象工厂...

B1105 Spiral Matrix (画图)

B1105 Spiral Matrix (25分) //第一次只拿了21分 矩阵的长和宽,求最大因子,从sqrt(num)开始枚举. 每次循环一次,s++,t--,d--,r++ 测试点四运行超时,是因为输入一个数字的时候,需要直接输出这个数字。//1分 测试点二运行超时,最后一个数字不必再while循环一次,直接输出即可。//3分 最后一个测试点卡了好久/(ㄒoㄒ)/~~ 螺旋矩阵...

Java基础=>String,StringBuffer与StringBuilder的区别

字符串常量池 什么是字符串常量池? JVM为了减少字符串对象的重复创建,其维护了一块特殊的内存,这段内存被称为字符串常量池(存储在方法区中)。 具体实现 当代码中出现字符串时,JVM首先会对其进行检查。 如果字符串常量池中存在相同内容的字符串对象,如果有,则不再创建,直接返回这个对象的地址返回。 如果字符串常量池中不存在相同内容的字符串对象,则创建一个新的字符串对象并放入常量池,并返回新创建的字符...

java调用其他java项目的Https接口

项目中是这样的: 用户拿出二维码展示,让机器识别二维码, 机器调用开门的后台系统接口, 然后开门的后台系统接口需要调用管理系统的接口, 管理系统需要判断能不能开门.这两个系统是互相独立的.当时使用http调用是没有问题的.当时后来要求必须用https.废话不说,直接代码: 我的项目中调用的是 HttpsUtils.Get(utlStr) 这个接口 开门系统接口如下图:   管理系统的接口...

猜你喜欢

Hadoop1.2.1全分布式模式配置

一 集群规划 主机名            IP                               安装的软件 &nbs...

Go语言gin框架的安装

尝试安装了一下gin,把遇到的一些小问题来记录一下 安装步骤 首先来看看官方文档,链接点这里 可以看到安装步骤很简单,就一句话 在命令行中输入这句话运行等待就好。 问题来了,因为墙的问题,go get会很慢,所以命令行里面半天什么反应也没有,不要急,慢慢等着就会看到gin-gonic/gin这个目录出现 这个时候命令行还是没有结束,表示还在下一些东西。有的时候可能心急的人就停了(比如我),然后写个...

uni-app表单组件二

input(输入框) 属性名 类型 说明 平台差异 value String 输入框的初始内容 type String input 的类型 password Boolean(默认false) 是否是密码类型 placeholder String 输入框为空时占位符 placeholder-style String 指定 placeholder 的样式 placeholder-class Strin...

深入理解 JavaScript 代码执行机制

深入理解 JavaScript 代码执行机制 前言 本文仅为个人见解,如有错误的地方欢迎留言区探讨和指正。 1、餐前甜品 如下是一段 JavaScript 代码,如果你毫不犹豫的说出代码执行顺序。那么请直接滚动到底部,留下你的足迹,接受膜拜。如果还不是很确定,那么请往下继续查看。 2、磨刀不误砍柴工(了解浏览器原理) (1) 进程和线程 进程是cpu资源分配的最小单位(是能拥有资源和独立运行的最小...

Centos7下配置DRBD Cluster扩展节点

操作环境 CentOS Linux release 7.4.1708 (Core) DRBDADM_BUILDTAG=GIT-hash:\ ee126652638328b55dc6bff47d07d6161ab768db\ build\ by\ [email protected]\,\ 2018-07-30\ 22:23:07 DRBDADM_API_VERSION=2 DRBD_KERNEL_VER...