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.打开…

unity中实现3D物体在UI前方

在Unity中&#xff0c;如果你想要将3D物体显示在UI的前方&#xff0c;可以通过Canvas和RawImage来实现。以下是一些步骤&#xff1a; 创建Canvas&#xff1a; 在场景中创建一个Canvas对象。你可以在Hierarchy视图中右键点击&#xff0c;选择UI > Canvas&#xff0c;或者在创…

MySQL中year()和month()函数解析与输出示例详解

摘要 在MySQL中&#xff0c;year()和month()函数是用于从日期或日期时间类型的数据中提取年份和月份的常用函数。本文将详细介绍这两个函数的底层逻辑&#xff0c;包括日期格式的识别和相应值的获取&#xff0c;并提供实例和输出结果作为示例。 1. year()函数的底层逻辑 MySQL…

【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…

AI告诉你怎么关闭Windows系统的自动更新的一般步骤——以Windows 10为例

在Windows系统中&#xff0c;彻底关闭自动更新的步骤可能会随着操作系统的版本而有所不同。以下是适用于大多数Windows版本&#xff08;如Windows 10&#xff09;的关闭自动更新的一般步骤&#xff1a; 方法一&#xff1a;使用组策略编辑器 按下 Win R 键打开运行对话框&…

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

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

备战蓝桥杯 Day5

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

计算最大值和最小值的差值

计算最大值和最小值的差值 . 计算最大值和最小值的差值题目描述:解法思路:解法代码: 题目描述: 输入10个整数&#xff0c;写代码找出其中最大值和最小值&#xff0c;计算最大值和最小值的差&#xff0c;并打印出差值结果 测试1&#xff1a;输入&#xff1a;1 2 3 4 5 6 7 8 9 …

【python】python入门之计算

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

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

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

二叉树相关算法需了解汇总-基础算法操作

文章目录 144.二叉树的前序遍历145.二叉树的后序遍历94.二叉树的中序遍历102.二叉树的层序遍历107.二叉树的层次遍历倒序199.二叉树的右视图637.二叉树的层平均值429.N叉树的层序遍历515.在每个树行中找最大值116.填充每个节点的下一个右侧节点指针104.二叉树的最大深度111.二叉…

Transformer实战-系列教程21:DETR 源码解读8 损失计算:(SetCriterion类)

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 DETR 算法解读 DETR 源码解读1&#xff08;项目配置/CocoDetection类/ConvertCocoP…

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 的触发器和存储过程一样&…

JS面向对象:五.原型对象

使用原型对象来共享方法&#xff0c;可以避免为每个对象创建独立的方法副本&#xff0c;提高代码的效率和可维护性。 在JavaScript中&#xff0c;每个函数都有一个 prototype 属性&#xff0c;这个属性是一个指向原型对象的指针。原型对象是一个普通的对象&#xff0c;它包含可…

如何写项目的ReadMe

README README主要是为了体现项目全景概览或项目描述&#xff0c;告知刚接触的新人&#xff0c;如何快速上手项目&#xff0c;降低沟通成本。 README编写的原则&#xff1a;简明扼要&#xff0c;条理清晰&#xff0c;图文并茂。 至少包含但不限于以下方面&#xff1a; 项目简介…

小邦教你16招轻松玩转职场

社会中的政治和经济密不可分&#xff0c;在职场中职场政治和个人能力同样密不可分&#xff0c;职场中的精英们个个有能力&#xff0c;懂政治&#xff0c;这一点官场最为尤甚。以下是小邦为大家收集的教你16招轻松玩转职场&#xff0c;仅供参考&#xff0c;大家一起来看看吧。 1…

JAVA表达式

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