java的泛型【详解】

定义类、接口、方法时,同时声明了一个或者多个类型变量(如:<E>) ,称为泛型类、泛型接口,泛型方法、它们统称为泛型。

作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力!这样可以避免强制类型转换,及其可能出现的异常。

1.泛型类:

        定义类的同时定义了泛型的类就是泛型类

        泛型类的格式:

        作用: 在编译阶段可以指定能操作的数据的类型

        原理: 把出现泛型变量的地方全部替换成传输的真实数据类型。

代码演示1:

package com.itheima.day06.teacher.c_generics;import java.util.ArrayList;
/**集合用泛型的意义集合是存储对象的容器。一般来说存储的同种类型的对象。泛型:未知的类型     定义的时候不知道具体的类型。定义集合的时候,是不知道具体的集合对象存储什么类型对象的。所以集合采用泛型 来表示 未知的类型。你可以将泛型理解成一个占位符。使用集合的时候就需要确定 集合存储什么具体的类型了。确定之后  所有用到泛型的位置都会变成 具体的类型泛型 在定义不确定,在使用的时候必须确定。*/
public class GenericsDemo01 {public static void main(String[] args) {//这里是没用泛型一个类型定义一个集合ArrayList<String> list = new ArrayList<>();list.add("aaa");// list.add(12); //泛型限定传输的类型ArrayList<Integer> list2 = new ArrayList<>();list2.add(12);ArrayList list3 = new ArrayList();// Objectlist3.add("aaa");list3.add(123);list3.add("123");for (int i = 0; i < list3.size(); i++) {Object o = list3.get(i);String s = (String) o;}}
}--------------
package com.itheima.day06.teacher.c_generics;/**这里是用泛型之后
*/
public class NBA<MVP>{ //泛型定义在类上//作用  在类中 都可以去使用这个未知的类型private MVP mvp ;//MVP泛型类型 定义的时候不具体public MVP getMvp(){//可以当成返回值类return mvp;}public void setMvp(MVP mvp) {//可以作为参数类型this.mvp = mvp;}
}------
package com.itheima.day06.teacher.c_generics;/*** 测试类*/
public class Demo01 {public static void main(String[] args) {//创建一个NBA对象NBA<String> nba = new NBA<>();nba.setMvp("恩比德");String mvp = nba.getMvp();System.out.println(mvp);NBA<Integer> nba2 = new NBA<>();nba2.setMvp(77);System.out.println(nba2.getMvp());}
}-----------

代码演示2:

package com.itheima.day06.teacher.d_generics;/*泛型只能是引用类型*/public class MyArrayList<E>{//定义底层数组变量private Object[] array = new Object[10];//定义初始容量//定义一个数组的初始索引private int index = 0;/*添加元素  add(E )*/public void add(E e){array[index] = e;index++;}/*根据索引获取元素*/public E get(int index){return (E)array[index];}
}-------------
package com.itheima.day06.teacher.d_generics;/*** 测试类*/
public class Demo {public static void main(String[] args) {MyArrayList<String> list = new MyArrayList<>();list.add("霍霍霍");list.add("魁魁魁");String s = list.get(0);System.out.println(s);}
}

2.泛型接口

        使用了泛型定义的接口就是泛型接口

        格式:修饰符 interface 接口名称<泛型变量>{}

        作用:泛型接口可以让实现类选择当前功能需要操作的数据类型

        原理:实现类可以在实现接口的时候传入自己操作的数据类型,这样重写的方法都将是针对于该类型的操作。

代码演示:

package com.itheima.day06.teacher.e_generics;
/**泛型接口
*/
public interface MyHoliday<X>{//泛型定义在接口   规范方法的使用void eat(X x);
}-------------
package com.itheima.day06.teacher.e_generics;public class Student implements MyHoliday<String>{@Overridepublic void eat(String s) {System.out.println("吃烧烤...吃棒棒糖  bulubiu");}
}------------
package com.itheima.day06.teacher.e_generics;import java.util.Comparator;
/**泛型类也可以实现泛型接口
*/
public class Teacher<X> implements MyHoliday<X>{@Overridepublic void eat(X x) {}
}

3.泛型方法

定义方法时同时定义了泛型的方法就是泛型方法

格式:

作用:方法中可以使用泛型接收一切实际类型的参数,方法更具备通用性。

代码演示:

package com.itheima.day06.teacher.f_generics;
/**泛型方法
*/
public class GenericsDemo {public static void main(String[] args) {String aaa = test("aaa");Integer test = test(12);Double test1 = test(1.23);}public static <T> T test(T t){return t;}
}---------------
package com.itheima.day06.teacher.f_generics;
/**泛型类里定义泛型方法
*/
public class Sugar<E> {private E e;public E getE(){return e;}public <T> void show(T t){//泛型定义在方法上}}

4.泛型通配符、上下限

        ? 可以在“使用泛型”的时候代表一切类型。

        E T K V 是在定义泛型的时候使用的。

泛型的上下限:

       1. ? extends Car: ?必须是Car或者其子类 泛型上限

       2. ? super Car : ?必须是Car或者其父类 泛型下限

 代码演示:

package com.itheima.day06.teacher.f_generics;import java.util.ArrayList;/*定义几个类*/
class Car extends Object {
}class BENZ extends Car {
}class ThreeBengZi extends Car {
}public class Test {public static void main(String[] args) {ArrayList<BENZ> list1 = new ArrayList<>();ArrayList<ThreeBengZi> list2 = new ArrayList<>();ArrayList<Car> list3 = new ArrayList<>();ArrayList<Object> list4 = new ArrayList<>();test1(list1);test1(list2);test1(list3);test1(list4);test2(list1);test2(list2);test2(list3);test2(list4);System.out.println("===================");System.out.println("=  只能车及其子类 可以接收========");test3(list1);//   ArrayList<BENZ> list1 = new ArrayList<>();test3(list2);//   ArrayList<ThreeBengZi> list2 = new ArrayList<>();test3(list3);//   ArrayList<Car> list3 = new ArrayList<>();//   ArrayList<Car> list3 =  new ArrayList<Car>();//  如果类型有泛型  类型<泛型>  整体是一个类型!!//  List<Car>  ArrayList<Car>
//        test3(list4);// <? extends Car> 泛型的类型是Car或及其子类!// <? super Car>   泛型的类型是Car或及其父类!System.out.println("=  只能车及其父类 可以接收========");
//        test4(list1);
//        test4(list2);test4(list3);test4(list4);}/*设计一个方法 可以接收 各种各样的集合*/public static <T> void test1(ArrayList<T> list) {System.out.println("测试");}/*? 通配符接收带有泛型集合*/public static void test2(ArrayList<?> list) {System.out.println("测试");}public static void test3(ArrayList<? extends Car> list) {System.out.println("限制泛型的类型!!!!!");}public static void test4(ArrayList<? super Car> list) {System.out.println("限制泛型的类型!!!!!");}
}

最后注意事项:

泛型的注意事项:擦除问题、基本数据类型问题

        1.泛型是工作在编译阶段的,一旦程序编译成class文件,class文件中就不存在泛型了,这就是泛型擦除。(大白话就是执行后生成的class文件,不在是你定义的字母,而是你传入的实际类型)

        2.泛型不支持基本数据类型,只能支持对象类型(引用数据类型)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/689420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】【Pycharm】Python Script头文件设置

1、步骤&#xff1a;File->settings->Editor->File and CodeTemplates->Python Script 2、复制粘贴以下代码&#xff0c;应用即可&#xff1a; #!/usr/bin/env python # -*- coding: utf-8 -*-# Time :${DATE} ${TIME} # Author : admin # Site :${SITE} …

数据库应用:kylin 部署 达梦数据库DM8

目录 一、实验 1.环境 2.部署前规划 3.部署达梦数据库DM8 4.创建数据库及数据库事例管理 5.达梦数据库的基本操作 二、问题 1.xhost命令报错 2.执行安装程序DMInstall.bin 报错 3.解压安装程序报错 4.安装程序找不到文件 5.图像化界面打不开 6.安装内存太小 7.打开…

【HarmonyOS】【DevEco ohpm ERROR: NOTFOUND package “@ohos/hypium“如何解决

参考 &#xff1a;&#xff08;无效&#xff09; 华为开发者论坛 DevEco创建项目时的错误解决_6 月 优质更文活动_路北路陈_InfoQ写作社区 解决&#xff1a; HormonyOS-DevEco Studio新建空项目ERROR解决_oh_modules\ohos\hypium-CSDN博客 将 .ohpm文件夹中的hypium文件夹复…

【Node-RED】安全登陆时,账号密码设置

【Node-RED】安全登陆时&#xff0c;账号密码设置 前言实现步骤密码生成setting.js 文件修改 安全权限 前言 Node-RED 在初始下载完成时&#xff0c;登录是无账号密码的。基于安全性考虑&#xff0c;本期博文介绍在安全登陆时&#xff0c;如何进行账号密码设置。当然&#xff…

相机图像质量研究(35)常见问题总结:图像处理对成像的影响--运动噪声

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

备战蓝桥杯 Day5

1191&#xff1a;流感传染 【题目描述】 有一批易感人群住在网格状的宿舍区内&#xff0c;宿舍区为n*n的矩阵&#xff0c;每个格点为一个房间&#xff0c;房间里可能住人&#xff0c;也可能空着。在第一天&#xff0c;有些房间里的人得了流感&#xff0c;以后每天&#xff0c;得…

【python】python入门之计算

“数字”&#xff1a; 介绍一下不同形式的数字们 字符串“6”数字6浮点数6.0 注意&#xff1a;输入时的内容自定义为字符串&#xff0c;需要用int&#xff08;&#xff09;进行强制转换 优先级&#xff1a; 常见优先级如下&#xff08;优先级指的是一个算式中先算的部分&…

产品经理学习-产品运营《流程管理》

如何进行流程管理 信息可视化 甘特图-流程管理思维导图-方案讨论原型图-活动文档 明确责任制 分工明确&#xff0c;关键环境有主负责人通过时间倒推督促管理 沟通技巧 明确共同利益以结果激励做好信息同步 如何进行监控活动效果 监控活动的效果是要监控数据 活动每个环境的…

06 分频器设计

分频器简介 实现分频一般有两种方法&#xff0c;一种方法是直接使用 PLL 进行分频&#xff0c;比如在 FPGA 或者 ASIC 设计中&#xff0c;都可以直接使用 PLL 进行分频。但是这种分频有时候受限于 PLL 本身的特性&#xff0c;无法得到频率很低的时钟信号&#xff0c;比如输入 …

MySQL-触发器(TRIGGER)

文章目录 1. 触发器是什么&#xff1f;2. 触发器的优缺点3. 触发器的类型3.1 INSERT触发器3.2 UPDATE触发器3.3 DELETE触发器 4. 触发器的相关语法4.1 创建触发器4.2 查看触发器4. 删除触发器 1. 触发器是什么&#xff1f; 定义&#xff1a;MySQL 的触发器和存储过程一样&…

JAVA表达式

1.Java开发工具 IntelliJ IDEA被认为是目前Java开 发效率最快的IDE工具。是 JetBrains公司的产品&#xff0c;这家公司 总部位于捷克共和国的首都布拉格。 它整合了开发过程中实用的众多功 能&#xff0c;智能提示错误&#xff0c;强大的调试工 具&#xff0c;Ant&#xff0c;J…

【label studio 升级记录】

label studio 版本升级记录 label studio 从1.8.1 升级到1.11.0 过程记录启动后遇到问题1:解决方法: 遇到问题2 安装版本与启动显示的版本不一致解决方法: label studio 从1.8.1 升级到1.11.0 过程记录 # 当前(2024-02)最新版是1.11.0 pip install -U label-studio启动后遇到…

SQL-Labs靶场“1-5”关通关教程

君衍. 一、准备工作二、第一关 基于GET单引号字符型注入1、源码分析2、联合查询注入过程 三、第二关 基于GET整型注入1、源码分析2、联合查询注入过程 四、第三关 基于GET单引号变形注入1、源码分析2、联合查询注入过程 五、第四关 基于GET双引号字符型注入1、源码分析2、联合查…

你真的会数据结构吗:单链表

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载&#xff0c;请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主&#xff0c;代码兴国&#xff01;❤❤❤ 哈咯各位铁汁们&#xff0c;大家新年过得快乐吗&#xff1f;反正大伟是过得很快乐&#xff0c;天天就是玩玩玩…

面试redis篇-02缓存穿透

原理 例&#xff1a; 一个get请求&#xff1a;api/news/getById/1 缓存穿透&#xff1a;查询一个不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致每次请求都查数据库 解决方案一 缓存空数据&#xff0c;查询返回的数据为空&#xff0c;仍把…

Axure9必备函数(2)

字符串的属性和函数 length:返回字符串的字符长度&#xff0c;包括空格&#xff0c;注意:汉字占1个字符charAt(index):返回字符串中指定索引处的字符indexOf(searchValue"):返回调用函数的字符串中搜索值的第一个实例的起始索引。如果未找到搜索值&#xff0c;则返回 -1la…

ABAQUS应用04——集中质量的添加方法

文章目录 0. 背景1. 集中质量的编辑2. 约束的设置3. 总结 0. 背景 混塔ABAQUS模型中&#xff0c;机头、法兰等集中质量的设置是模型建立过程中的一部分&#xff0c;需要研究集中质量的添加。 1. 集中质量的编辑 集中质量本身的编辑没什么难度&#xff0c;我已经用Python代码…

Django后端开发——模型层及ORM介绍

文章目录 参考资料Django配置MySQL安装mysqlclient创建数据库进入数据库的操作可能遇到的问题及解决方案Pycharm配置settings.py 模型![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c83753397bf6481d8defde26537903bf.png)ORM介绍示例终端&#xff1a;settings.py…

Linux——开发工具的使用

目录 Linux软件包管理器 yum rzsz Linux编辑器——vim vim的使用 vim的基本操作 命令模式的常见命令 底行模式的常见命令 vim是需要配置的 Linux编译器——gcc/g 预处理 编译 汇编 链接 函数库 Linux项目自动化构建工具 make/makefile make原理 项目清理 Linux调试器g…

踩坑实录(Fourth Day)

今天开工了&#xff0c;其实还沉浸在过年放假的喜悦中……今天在自己写 Vue3 的项目&#xff0c;虽说是跟着 B 站在敲&#xff0c;但是依旧是踩了一些个坑&#xff0c;就离谱……照着敲都能踩到坑&#xff0c;我也是醉了…… 此为第四篇&#xff08;2024 年 02 月 18 日&#x…