文章目录

  • 前言
  • 一、“形象比喻”
  • 二、T、E、K、V、?的含义
  • 三、泛型类
  • 总结

前言

泛型(Generics)是在JDK 1.5 中推出的,其主要的目的是建立具有类型安全的集合框架,如链表,散列映射等数据结构。


一、“形象比喻”

首先,容器就相当于一个大桶,什么都可以向里面放。假设一个容器是你家的冰箱你可以向里面放猪肉,羊肉,牛肉,鱼肉,鸭肉等等,想放啥就放啥。放到时候很爽吧,但是有一天你想吃牛肉了,怎么办?还需要一个一个拿出来检查是不是牛肉,傻傻的分不清,是不是就很烦了。那我们应该怎么办?是不是可以这样,冰箱的每一格都给它贴上标签。放牛肉的就贴牛肉的标签,羊肉的贴羊肉标签……意味着在贴有牛肉的一格中放的时候就全部放牛肉,取的时候是不是就特别简单了,随便取就是牛肉了。泛型就是起到一个这样的作用,相当于在我们的容器上贴一个这样的标签,这样就可以帮助我们建立一个类型安全的集合了。专业点的说法——泛型的本质就是 “数据类型的参数化”。我们可以把“泛型”理解为数据类型的一个占位符(形式参数),即告诉编译器,在调用泛型时必须传入实际类型。

二、T、E、K、V、?的含义

1、可以认为的标准含义

E - Element (在集合中使用,因为集合中存放的是元素)
T - Type(Java 类) T代表在调用时的指定类型
K - Key(键)
V - Value(值)
N - Number(数值类型)
? - 表示不确定的java类型 一般用在通配

我们可以在类的声明处增加泛型列表,如:“class 名称<泛型列表>” <>中可以为<T,E,V>其实这里的字符其实可以为任何的标识符。

三、泛型类

我们可以使用 “class 名称<泛型列表>” 声明一个类,为了和普通的类有所区别,这样声明的类称作泛型类如:

 class People < E >       class 类名称 <泛型标识:可以随便写任意标识号,标识指定的泛型的类型>{private 泛型标识 /*(成员变量类型)*/ var; .....}
}

其中,People是泛型类的名称,E是其中的泛型,也就是说并没有指定E是何种类型的数据,它可以是任何类或接口,但不能是基本类型数据。也可以不用E表示泛型,任何一个合理的标识符都可以,但最好和我们熟悉的类型名称有所区别。泛型声明时,“泛型列表”给出的泛型可以作为类的成员变量的类型、方法的类型、以及局部变量的类型。

意思就是说我们在定义一个类时可以在类的后面跟着一个< E >,形象一下就是,类就相当于你家,而泛型就相当于你家门前横刀立马的“守门人”,你和他说 Int 可以进你家 那么它就只会把 Int 放进去,这样就有一个好处,如果你想找一个 Int 类型的人,去这个家里找就可以了就不用再通过"中间人" ——Int() (转型)的介绍了。

public class TestGeneric {public static void main(String[] args) {MyCollection<String>  mc= new MyCollection<String>();  //泛型为String类型mc.set("泛型", 0);//  mc.set(888, 1);//The method set(String, int) in the type MyCollection<String> is not applicable for the arguments (int, int)    //如果传入888数字类型就会报错,这就是泛型,规定好了你传入的类型,其他类型无法进入。String   b = mc.get(0);System.out.println(b);         //输出结果为 " 泛型 "}
}
class  MyCollection<E> {                      // 犹如“形参”的泛型Object[]  objs = new Object[5];public  void  set(E e, int index){    // 传入objs[index] = e;}public  E  get(int index){     //取值return  (E) objs[index];}
}

问题所在
// mc.set(888, 1);
//The method set(String, int) in the type MyCollection is not applicable for the arguments (int, int)
//如果传入888数字类型就会报错,这就是泛型,规定好了你传入的类型,其他类型无法进入。

总结

Java泛型的主要目的是可以建立具有类型安全的数据结构,如链表,散列表等数据结构,最重要的一个优点就是:在使用这些泛型类建立的数据结构时,不必进行强制类型转换,即不要求进行运行时类型检查。

泛型 (Generics)一定是最易懂简单的相关推荐

  1. java的知识点23——泛型Generics、Collection接口、List特点和常用方法、 ArrayList特点和底层实现

    泛型Generics 一般通过"容器"来容纳和管理数据.程序中的"容器"就是用来容纳和管理数据. 数组就是一种容器,可以在其中放置对象或基本类型数据. 数组的优 ...

  2. Java基础学习——泛型(generics)学习一

    概述 在JDK 5.0,Java语言引入了好几个新的功能,其中很重要的一个就是泛型(generics). 本文就是对泛型的一个概述.你可以很熟悉其他语言中的类似结构,比如C++里的模板(templat ...

  3. 【TS】泛型 Generics

    泛型Generics,是指在定义函数Function.接口Interface 或类 Class 时不预先指定具体的类型,而是在使用的时候再指定类型的一种特征. // 函数名后的 <> 内传 ...

  4. Java基础 --- 泛型 Generics

    Java基础 --- 泛型 Generics 为什么需要泛型 泛型 Bounds for Type Variable Java虚拟机如何处理泛型 --- 泛型擦除 Restrictions and L ...

  5. 27.泛型generics.rs

    /* fn max(array: &[i32]) -> i32 {let mut max_index = 0;let mut i = 1;while i < array.len() ...

  6. java基础知识(七)-- 泛型(Generics )

    介绍 用法: List list = new ArrayList();// 1 list .add(new Integer(12));// 2 Integer x = (Integer) list . ...

  7. Rust泛型Generics

    泛型 泛型(Generics)是一种程序设计风格,它允许程序员在强类型语言(例如rust,c#,c++)中编写代码时使用通用类型.以rust为例,如果你想实现一个通用的add函数,让其在u8, i32 ...

  8. Java 泛型(Generics) 综述

    一. 引子 一般的类和方法,只能使用具体类型:要么是基本类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大. 多态 算是一种泛化机制,但对代码的约束还是太强 ...

  9. Java泛型Generics

    转载请标明出处: http://blog.csdn.net/wu_wxc/article/details/51493181 本文出自[吴孝城的CSDN博客] 泛型 泛型是JDK 5中引入的一个新特性 ...

最新文章

  1. 数据库学习day_02:表格相关sql语句 / 表格数据相关sql语句 / sql中的数据类型 / 导入外部sql文件 / 去重.是否为null.and与or.in.[x,y]
  2. java笔记 -- GregorianCalendar和DateFormateSymbols 类方法
  3. PMP-【第10章 项目沟通管理】-2021-2-16(220页-231页)
  4. 点击左侧导航栏切换右侧商品(左右联动)
  5. 云炬随笔20171209
  6. c#开发中遇到System.AccessViolationException
  7. 计算机视觉,不可能凉!
  8. 前端组件化的三种方案:
  9. oracle的local,11G R2 Oracle Local Registry(OLR)
  10. [C++]Linux之C编程异常[true未定义解决方案]
  11. pytorch/tensorflow 查看 cuda 是否可用
  12. H3CSE路由-BGP属性
  13. canoco5主成分分析步骤_权重赋值之“主成分分析法”
  14. l351墨水灯和缺纸灯闪烁_爱普生l351充墨灯闪烁是怎么回事?
  15. 如果一个n位正整数等于它的n个数字的n次方和,则称该数为n位自方幂数。编程计算并输出所有的n的所有情况。
  16. 华为最终面试java_最全的华为面试题-java学习
  17. 惠普服务器做linux系统安装系统教程,HP刀片服务器安装系统步骤
  18. vscode使用ssh连接远程Ubuntu服务器(记录)
  19. 第一章第十三题(代数:求解2 × 2线性方程组)(Algebra: solve 2 × 2 linear equations)
  20. mysql 命令行登录详解

热门文章

  1. html模板文件打开空白,Webpack打包index打开空白
  2. java动态修改class_Java Agent入门学习之动态修改代码
  3. MySQL workbench创建用户与授权
  4. MapUtils常用方法
  5. SPOJ 20713 DIVCNT2 - Counting Divisors (square)
  6. 【medium】220. Contains Duplicate III
  7. 每天学一点ubuntu指令
  8. Python基础 - MySQLdb模块
  9. Ubuntu 下无法Tab键自动补全功能解决办法
  10. Bootstrap系列 -- 17. 复选框checkbox和单选择按钮radio