01_泛型

文章目录

  • 泛型
    • 泛型类
    • 泛型接口
    • 泛型方法
    • 泛型的通配
    • 泛型的擦除

泛型

参数化类型。

在这里插入图片描述

泛型的好处

  • 省去了类型强转的麻烦(比如:Object类、interface接口等都需要类型强转)
  • 运行期遇到的问题转移到了编译期

泛型类

所谓泛型类, 就是把泛型定义在类上

格式

class 类名<泛型类型1,...> {
}

注意事项

  • 默认类型
    • 定义了泛型,但是未写在<>中,会将其直接当做Object使用。
      eg:
// 如果我们有一个使用了泛型写法的地方,  当我们使用这段代码的时候需要传入泛型, 
// 如果没有传, 这个泛型默认为Object类型Holder2 holder3 = new Holder2(new AutoCar());
Object o = holder3.get();
  • 泛型的使用写法
    eg:
// jdk1.5版本的时候写法: 前后尖括号都要指明类型
User<String> user1 = new User<String>();// jdk1.7版本的时候, 对jdk1.5写法的简化, 本质上等价的
User<String> user1 = new User<>();
  • 泛型类可以定义多个泛型
    • 可以定义多个泛型,但不建议超过两个
    • 定义多个泛型,使用时,要么全部指定类型,要么全部不指定类型
      eg:
class User<T, E>{T data;E info;
}User<int, String> user = new User<>(2024 , "hello");
  • 定义了多个泛型,也可以不使用
    eg:
class User3 <T, E, K> {T name;E age;
}
  • 泛型标识符

    • 使用单个大写字母。比如:E、T、K、V、R
      • E:element;
      • T:type;
      • K:key;
      • V:value;
      • R:return
  • 泛型必须使用引用类型,不能使用基本类型
    eg:

User<int> user = new User<>(); // 报错: 泛型必须使用引用类型User<Integer> user = new User<>();
  • 泛型类, 定义了泛型之后, 泛型的作用域

      1. 在自己的类中间,会起作用。但是在子类中,不起作用。
      1. 在自己的类上面(指public class User<T> extends Person<E, E>),就是在自己的类定义这一行,可以使用这个泛型。
  • 泛型在父子继承关系上的表现

    • 如果继承时,未指定父类泛型,则为默认类型。Object
      • class Son1 extends Father{}
    • 如果继承时,指定了父类类型,则为指定类型,无论子类定义泛型与否。
      • class Son2 extends Father<String>{} --> 父类变量类型为String
      • class Son3<E> extends Father<Integer>{} --> 父类变量类型为Integer
    • 如果继承时,传入了子类指定的泛型,则父类与子类变量类型一致
      • class Son4<E> extends Father<E>{}

eg:

public class Father<T> {T ft;
}class Son1 extends Father {}class Son2 extends Father<Integer> {}class Son3<E> extends Father<String> {}class Son4<T> extends Father<T> {}class Son5<E> extends Father<E>{}public class FatherDemo {public static void main(String[] args) {// 定义类的时候,没有指定Father的类型,所有默认类型为ObjectSon1 son1 = new Son1();Object ft = son1.ft;// Son2 定义时,未指定泛型,指定了 Father泛型为Integer,所以ft为IntegerSon2 son2 = new Son2();Integer ft1 = son2.ft;// 如果继承时,指定了父类类型,则为指定类型,无论子类定义泛型与否Son3<Integer> son3 = new Son3();String ft4 = son3.ft;// Son4 定义时,指定泛型T,指定了 Father泛型为T,所以ft类型和子类一致Son4<Integer> son4 = new Son4<>();Integer ft2 = son4.ft;// Son5 指定E,表示与符号无关Son5<String> son5 = new Son5<>();String ft3 = son5.ft;}
}

泛型接口

所谓泛型接口, 就是把泛型定义在接口上

格式

interface 接口名<泛型类型1...>

举例


interface Player<T,E> {E play(T data);
}// 在什么时候能指定它的类型?// 1. 实现接口的时候没有指定类型,则泛型的类型为默认的Object
class YoungPlayer implements Player{@Overridepublic Object play(Object data) {return null;}
}// 2. 如果实现时,指定为什么类型,则是什么类型
class OldPlayer implements Player<String, Integer>{@Overridepublic Integer play(String data) {return null;}
}// 3. 如果子类也有泛型,则与子类一致
class BigPlayer<K,V> implements Player<K,V>{@Overridepublic V play(K data) {return null;}
}

eg:


// 转换器的接口,把一个类型转换成另外一个类型
interface Converter<T, R> {R converter(T t);
}public class String2Date implements Converter<String, Date> {@Overridepublic Date converter(String s) {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");Date parse = null;try {parse = simpleDateFormat.parse(s);} catch (ParseException e) {throw new RuntimeException(e);}return parse;}
}

泛型方法

所谓泛型方法, 把泛型定义在方法上

格式

 <泛型类型> 返回类型 方法名(泛型类型...)

eg:

public class Demo {public static void main(String[] args) {A a = new A();Integer t = a.getT(10);String s = a.getT("hello");}
}class A{<T> T getT(T data){return data;}
}

注意事项
方法上没有定义泛型,只是使用了泛型,不叫泛型方法。


泛型的通配

(看到源码,能明白含义即可。)

泛型不允许协变, 又想产生类似协变的效果, 又不想引入协变带来的问题(类型不匹配问题)

协变与逆变

  • 协变就是,允许接收该类及该类的子类
    • 数组是支持协变的。
  • 逆变就是,允许接收该类及该类的父类

格式

  • 泛型通配符<?>
    • 任意类型,如果没有明确,那么就是Object以及任意的Java类了
    • public void print(User<?> user)
  • ? extends E
    • 向下限定,E及其子类
    • public void print(User<? extends Number> user)
  • ? super E
    • 向上限定,E及其父类

泛型的擦除

  • Java中的泛型并不是真的泛型, Java的泛型只存在于编译之前
  • 当Java中的泛型编译之后, 会把泛型编译成Object以及类型强转

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

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

相关文章

Android Dialog setCanceledOnTouchOutside失效,点击dialog外面不消失

前言&#xff1a;有一个需求需要点击dialog外面要消失&#xff0c;本来以为很简单结果设置了一直未生效 setCanceledOnTouchOutside(true); 问了半天chat-gpt4结果给的答案都不明显 查看代码发现设置了style&#xff0c;于是尝试去除这个style&#xff0c;结果点击setCancele…

【c++】——栈or队列or优先级队列

目录 &#x1f393;容器适配器 &#x1f393;Stack栈 &#x1f6a9;Stack的介绍 &#x1f6a9;Stack的基本使用 &#x1f6a9;Stack底层实现 &#x1f393;queue队列 &#x1f6a9;queue的介绍 &#x1f6a9;queue的基本使用 &#x1f6a9;queue的底层实现 &#x1…

【C++】C++的IO流

一、C语言的输入与输出 C 语言中我们用到的最频繁的输入输出方式就是 scanf () 与 printf()。 scanf()&#xff1a;从标准输入设备&#xff08;键盘&#xff09;读取数据&#xff0c;并将值存放在变量中。printf()&#xff1a;将指定的文字/字符串输出到标准输出设备&#xff…

Java如何做到无感知刷新token含示例代码(值得珍藏)

1. 前言 在系统页面进行业务操作时&#xff0c;有时会突然遇到应用闪退&#xff0c;并被重定向至登录页面&#xff0c;要求重新登录。此问题的出现&#xff0c;通常与系统中用于存储用户ID和token信息的Redis缓存有关。具体来说&#xff0c;这可能是由于token过期所导致的身份…

容器部署的nextcloud配置onlyoffice时开启密钥

容器部署的nextcloud配置onlyoffice时开启密钥 配置 进入onlyoffice容器 docker exec -it 容器id bash编辑配置vi /etc/onlyoffice/documentserver/local.json enable设置为true&#xff0c;并配置secret 重启容器&#xff0c;并将配置的密钥填入nextcloud密钥页面 docker r…

复杂字幕特效SDK,重塑视频字幕新体验

字幕特效已经成为了提升视频品质、增强观众体验的重要手段。美摄科技作为行业领先的技术提供商&#xff0c;近期推出的复杂字幕特效SDK&#xff0c;更是引领了这一领域的创新潮流。 美摄科技复杂字幕特效SDK&#xff0c;不仅具备了电影级别的字幕功能&#xff0c;更实现了众多…

【全网最全】2024华数杯国际赛B题成品论文50页+1-4问高质量代码+完整数据集+建模过程+保姆级教学

基于数据分析下的光伏发电 摘 要&#xff08;完整版在文末&#xff09; 根据最新数据&#xff0c;中国的总发电量超过20万亿千瓦时&#xff0c;总体排名世界第一&#xff0c;而光伏发电是一种重要的可再生能源&#xff0c;可以将太阳能转化为电能可以减少对传统能源的依赖&…

VBA窗体跟随活动单元格【简易版】(2/2)

上一篇博客&#xff08;文章连接如下&#xff09;中使用工作表事件Worksheet_SelectionChange实现了窗体跟随活动单元格的动态效果。 VBA窗体跟随活动单元格【简易版】(1/2) 为了在用户滚动工作表窗体之后仍能够实现跟随效果&#xff0c;需要使用Application.Windows(1).Visibl…

归并排序详解

目录 ​&#x1f4a1;基本思想 &#x1f4a1;图文介绍 &#x1f4a1;动图演示 &#x1f4a1;过程解释 &#x1f4a1;代码实现 &#x1f4a1;递归实现 &#x1f4a1;非递归实现 &#x1f4a1;总结 &#x1f4a1;基本思想 归并排序&#xff08;MERGE-SORT&#xff09;是…

数据结构--串

本文为复习的草稿笔记&#xff0c;&#xff0c;&#xff0c;有点乱 1. 串的基本概念和基本操作 串是由零个或多个字符组成的有限序列 2. 串的存储结构 3.串的应用 模式匹配 BF算法&#xff08;简单匹配算法 穷举法 算法思路&#xff1a;从子串的每一个字符开始依次与主串…

深耕文档型数据库12载,SequoiaDB再开源

1月15日&#xff0c;巨杉数据库举行SequoiaDB新特性及开源项目发布活动。本次活动回顾了巨杉数据库深耕JSON文档型数据库12年的发展历程与技术演进&#xff0c;全面解读了SequoiaDB包括在高可用、安全、实时、易用性四个方向的技术特性&#xff0c;宣布了2024年面向技术社区的开…

无法打开浏览器开发者工具的可能解决方法

网页地址: https://jx.xyflv.cc/?url视频地址url 我在抖音里面抓了一个视频地址, 获取到响应的json数据, 找到里面的视频地址信息 这个网站很好用: https://www.jsont.run/ 可以使用js语法对json对象操作, 找到所有视频的url地址 打开网页: https://jx.xyflv.cc/?urlhttps:…

【Linux C | 文件操作】目录相关操作 | mkdir、rmdir、opendir、readdir、closedir、getcwd、chdir

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

【LeetCode】栈精选9题

目录 1. 删除字符串中的所有相邻重复项&#xff08;简单&#xff09; 2. 逆波兰表达式&#xff08;中等&#xff09; 3. 基本计算器 II&#xff08;中等&#xff09; 4. 字符串解码&#xff08;中等&#xff09; 5. 验证栈序列&#xff08;中等&#xff09; 6. 小行星碰撞…

新能源汽车智慧充电桩方案:基于视频监控的可视化智能监管平台

一、方案概述 TSINGSEE青犀&触角云新能源汽车智慧充电桩方案围绕互联网、物联网、车联网、人工智能、视频技术、大数据、4G/5G等技术&#xff0c;结合云计算、移动支付等&#xff0c;实现充电停车一体化、充电桩与站点管理等功能&#xff0c;达到充电设备与站点的有效监控…

有效防范网络风险的关键措施

在数字化时代&#xff0c;企业面临着日益复杂和频繁的网络风险。提高员工的网络安全意识是防范网络威胁的关键一步。本文将探讨企业在提升网络安全意识方面可以采取的措施&#xff0c;以有效预防潜在的网络风险。 1. 开展网络安全培训&#xff1a;企业应定期组织网络安全培训&…

vue中内置指令v-model的作用和常见使用方法介绍以及在自定义组件上支持

文章目录 一、v-model是什么二、什么是语法糖三、v-model常见的用法1、对于输入框&#xff08;input&#xff09;&#xff1a;2、对于复选框&#xff08;checkbox&#xff09;&#xff1a;3、对于选择框&#xff08;select&#xff09;&#xff1a;4、对于组件&#xff08;comp…

java基本算法

1.链表 链表用来存储数据&#xff0c;由一系列的结点组成。这些结点的物理地址不一定是连续的&#xff0c;即可能连续&#xff0c;也可能不连续&#xff0c;但链表里的结点是有序的。一个结点由数据的值和下一个数据的地址组成。一个链表内的数据类型可以是多种多样的。数组也是…

中霖教育:2024年一建、二建考试问题整理

报名、考试时间&#xff1a; ①一建&#xff1a;报名时间6月;考试时间9月上旬 ②二建&#xff1a;报名时间1-3月份;考试时间6月 考试科目&#xff1a; ①一级建造师考试科目一共有四门,依次是《建设工程经济》、《建设工程法规及相关知识》、《建设工程项目管理》、《专业工…