java泛型和通配符的使用
泛型机制
本质是参数化类型(与方法的形式参数比较,方法是参数化对象)。
优势:将类型检查由运行期提前到编译期。减少了很多错误。
泛型是jdk5.0的新特性。
集合中使用泛型
总结:
- ① 集合接口或集合类在jdk5.0时都修改为带泛型的结构
- ② 在实例化集合类时,可以指明具体的泛型类型
- ③ 指明完以后,在集合类或接口中凡是定义类或接口时,内部结构(比如:方法、构造器、属性)使用到类的泛型的位置,都指定为实例化的泛型类型。
- 比如:add(E e) ---->实例化以后:add(Integer e)
- ④ 注意点:泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置,拿包装类替换。
- ⑤ 如果实例化时,没有指明泛型的类型。默认类型为java.lang.Object类型。
public class GenericTest {@Testpublic void test(){//没有使用泛型机制ArrayList list = new ArrayList();list.add(111);list.add(112);//问题一:类型不安全list.add("tom");for (Object score : list){//问题二:强制转换时,可能会报java.lang.ClassCastExceptionint sc = (int) score;System.out.println(sc);}}@Testpublic void test1(){//使用泛型,以ArrayList为例ArrayList<Integer> list = new ArrayList<Integer>();list.add(122);list.add(44);//编译时,会进行类型检查,保证数据的安全//list.add("tom");//方式一:for (Integer score:list) {//避免了强制转换操作System.out.println(score);}//方式二:IteratorIterator<Integer> iterator = list.iterator();while (iterator.hasNext()){int score = iterator.next();System.out.println(score);}//使用泛型,以HashMap为例Map<String, Integer> map = new HashMap<>();//jdk7新特性:类型推断HashMap<String, Integer> map1 = new HashMap<>();map.put("tom",111);map.put("jerry",25);//泛型的嵌套Set<Map.Entry<String, Integer>> entries = map.entrySet();Iterator<Map.Entry<String, Integer>> iterator1 = entries.iterator();while (iterator1.hasNext()){Map.Entry<String, Integer> next = iterator1.next();System.out.println(next);}}
}
自定义泛型结构
泛型类
public class Order<T> {String orderName;int orderId;//类的内部结构就可以使用类的泛型,可以把它看作是一个类型。T orderT;public Order(){}public Order(String orderName,int orderId,T orderT){this.orderName = orderName;this.orderId = orderId;this.orderT = orderT;}public T getOrderT() {return orderT;}public void setOrderT(T orderT) {this.orderT = orderT;}@Overridepublic String toString() {return "Order{" +"orderName='" + orderName + '\'' +", orderId=" + orderId +", orderT=" + orderT +'}';}
}
测试
public void test(){//如果定义了泛型类,实例化没有指明类的泛型,则认为此类型为Object类型。//要求:如果大家定义了类时带泛型的,建议在实例化时要指明类的泛型。Order order = new Order();order.setOrderT(123);order.setOrderT("aaa");//建议实例化时指明类的泛型Order<String> order1 = new Order<String>("aaa",101,"AA");order1.setOrderT("AA:hello");System.out.println(order.toString());}
自定义泛型类、泛型接口注意点补充
1、泛型类可能有多个参数,此时应将多个参数一起放在尖括号内。比如:<E1,E2,E3>
2、泛型类的构造器如下:public GenericClass(){},而下面的是错误的:public GenericClass(){}
3、实例化后,操作原来的泛型位置的结构必须与指定的泛型类型一致。
4、泛型不同的引用不能相互赋值。(尽管在编译时ArrayList 和 ArrayList 是两种类型,但是,在运行时只有一个ArrayList被加载到JVM中。)
5、泛型如果不指定,将被擦除,泛型对应的类型均按照Object处理,但不等价与Object。经验:泛型要使用一路都用。要不用,一路都不用。
6、如果泛型类是一个接口或抽象类,则不能创建泛型对象。
7、jdk1.7,泛型的简化操作:ArrayList flist = new ArrayList<>();
8、泛型的指定中不能使用基本数据类型,可以使用包装类替换。
9、在类/接口上声明的泛型,在本类或本接口中即代表某种类型,可以作为非静态属性的类型、非静态方法的参数类型、非静态方法的返回值类型。但在静态方法中不能使用类的泛型。
10、异常类不能是泛型的。
11、不能使用new E[]。但是可以:E[] elements = (E[]) new Object[capacity];参考:ArrayList源码中声明:Object[] elementData,而非泛型参数类型数组。
12、父类有泛型,子类可以选择保留泛型也可以选择指定泛型类型:
- 子类不保留父类的泛型:按需实现
没有类型 擦除
具体类型 - 子类保留父类的泛型:泛型子类
全部保留
部分保留 - 结论:子类必须是“富二代”,子类出了指定或保留父类的泛型,还可以增加自已的泛型
静态方法中不能使用泛型说明
//静态方法中不能使用泛型
// public static void show(T orderT){
// System.out.println(orderT);
//
在程序运行时,首先加载静态变量和静态方法,而参数T orderT的泛型定义时在加载静态变量和方法之后的
泛型方法
//泛型方法:在方法中出现了泛型结构,泛型方法与类的泛型参数没有任何关系。//换句话说,泛型方法所属类是不是泛型类没有任何关系。//泛型方法,可以声明为静态的。原因:泛型参数时在调用方法时确定的,并不是在实例化类时确定。public static <E> List<E> copyFromArrayToList(E[] arr){ArrayList<E> list = new ArrayList<>();for(E e: arr){list.add(e);}return list;}
泛型在继承方面的体现
类A是类B的父类,G<A> 和 G<B>不具备子父类,关系,是并列关系。
public void test1(){Object obj = null;String str = null;obj = str;List<Object> list1 = null;List<String> list2 = null;//此时的List1和List2类型不具有子父类关系。//编译不通过
// list1 = list2;}
扩展:类A是类B的父类,A<G>是B<G>的父类。
public void test2(){List<String> list1 = null;ArrayList<String> list2 = null;list1 = list2;}
通配符的使用
类A是类B的父类,G<A> 和 G<B>是没有关系的,二者的共同父类是:G<?>
public class Test1 {@Testpublic void test1(){List<Object> list1 = null;List<String> list2 = null;List<?> list = null;list = list1;list = list2;print(list1);print(list2);}public void print(List<?> list){Iterator<?> iterator = list.iterator();while (iterator.hasNext()){Object obj = iterator.next();System.out.println(obj);}}
}
使用通配符后读取写入的要求
List<?> list = null;
List<String> list3 = new ArrayList<>();list3.add("aa");list3.add("bb");list = list3;//添加(写入):对于List<?>就不能向其内部添加数据。//出了添加NULL之外。//List.add("DD");编译器异常list.add(null);//获取(读取):允许读取数据,读取的数据类型为ObjectObject o = list.get(0);
有限制条件的通配符使用
通配符指定上限:extends,使用时指定的类型必须是继承某个类,或者实现某个接口,即<= 。
<? extends Number> (无穷小,Number]:只允许泛型为Number即Number子类的引用调用。 <? super Number> [Number,无穷大):只允许泛型为Number即Number父类的引用调用。 <? extends Comparable>:只允许泛型为实现Comparable接口的实现类的引用调用。
通配符指定下限:super,使用时指定的类型不能小于操作的类,即>= 。
举例:
测试
创建了两个类,Student,Person,Person是Student的父类
/*? extends Person:G<? extends Person>可以作为G<A>和G<B>的父类,其中B是A的子类。? super Person:G<? super Person>可以作为G<A>和G<B>的父类,其中B是A的父类。*/
public void test2(){List<? extends Person> list1 = null;List<? super Person> list2 = null;List<Student> list3 = null;List<Person> list4 = null;List<Object> list5 = null;list1 = list3;list1 = list4;//list1 = list5;编译期异常//list2 = list3;编译期异常list2 = list4;list2 = list5;//读取数据list1 = list4;Person person = list1.get(0);//编译不通过//Student s = list1.get(0);list2 = list4;Object obj = list2.get(0);//编译不通过//Person p = list2.get(0);//写入数据//list1.add(new Student());编译不通过,list1 ?可能是比Student还要小的类,故不能添加。//编译通过list2.add(new Person());list2.add(new Student());}
相关文章:
java泛型和通配符的使用
泛型机制 本质是参数化类型(与方法的形式参数比较,方法是参数化对象)。 优势:将类型检查由运行期提前到编译期。减少了很多错误。 泛型是jdk5.0的新特性。 集合中使用泛型 总结: ① 集合接口或集合类在jdk5.0时都修改为带泛型的结构② 在实例化集合类时…...
【网络】自定义协议 | 序列化和反序列化 | 以tcpServer为例
本文首发于 慕雪的寒舍 以tcpServer的计算器服务为例,实现一个自定义协议 阅读本文之前,请先阅读 tcpServer 本文完整代码详见 Gitee 1.重谈tcp 注意,当下所对tcp的描述都是以简单、方便理解起见,后续会对tcp协议进行深入解读 …...
06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计)
文章目录 1. 主要的窗体类及其用途2. 窗体类重要特性的设置2.1 setAttribute()函数2.2 setWindowFlags()函数2.3 setWindowState()函数2.4 setWindowModality()函数2.5 setWindowOpacity()函数 3. 多窗口应用程序设计3.1 主窗口设计3.2 QFormDoc类的设计3.3 QFormDoc类的使用3.…...
(力扣)用两个栈实现队列
这里是栈的源代码:栈和队列的实现 当然,自己也可以写一个栈来用,对题目来说不影响,只要符合栈的特点就行。 题目: 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、pe…...
【自动化测试框架】关于unitttest你需要知道的事
一、UnitTest单元测试框架提供了那些功能 1.提供用例组织和执行 如何定义一条“测试用例”? 如何灵活地控制这些“测试用例”的执行? 2.提供丰定的断言方法 当测试用例的执行结果与预期结果不一致时,判定测试用例失败。在自动化测试中,通过“断言”…...
手机便签中可以打勾的圆圈或小方块怎么弄?
在日常的生活和工作中,很多网友除了使用手机便签来记录灵感想法、读书笔记、各种琐事、工作事项外,还会用它来记录一些清单,例如待办事项清单、读书清单、购物清单、旅行必备物品清单等。 在按照记录的清单内容来执行的时候,为了…...
【Linux】gdb 的使用
目录 1. 使用 gdb 的前置工作 2. 如何使用 gdb 进行调试 1、如何看到我的代码 2、如何打断点 3、怎么运行程序 4、如何进行逐过程调试 5、如何进行逐语句调试 6、如何监视变量值 7、如何跳到指定位置 8、运行完一个函数 9、怎么跳到下一个断点 10、如何禁用/开启…...
C++11之右值引用
C11之右值引用 传统的C语法中就有引用的语法,而C11中新增了的 右值引用(rvalue reference)语法特性,所以从现在开始我们之前学习的引用就叫做左值引用(lvalue reference)。无论左值引用还是右值引用&#…...
【PHP的设计模式】
PHP的设计模式 一、策略模式二、工厂模式三、单例模式四、注册模式五、适配器模式六、观察者模式 一、策略模式 策略模式是对象的行为模式,用意是对一组算法的封装。动态的选择需要的算法并使用。 策略模式指的是程序中涉及决策控制的一种模式。策略模式功能非常强…...
React 之 Redux - 状态管理
一、前言 1. 纯函数 函数式编程中有一个非常重要的概念叫纯函数,JavaScript符合函数式编程的范式,所以也有纯函数的概念 确定的输入,一定会产生确定的输出 函数在执行过程中,不能产生副作用 2. 副作用 表示在执行一个函数时&a…...
集合转数组
首先,我们在看到集合转数组的时候可能第一个想到的就是toArray(),但是我们在调用 toArray()的时候,可能会遇到异常 java.lang.ClassCastException;这是因为 toArray()方法返回的类型是 Obejct[],如果我们将其转换成其他类型&#…...
使用Python将Word文档转换为PDF的方法
摘要: 文介绍了如何使用Python编程语言将Word文档转换为PDF格式的方法。我们将使用python-docx和pywin32库来实现这个功能,这些库提供了与Microsoft Word应用程序的交互能力。 正文: 在现实生活和工作中,我们可能会遇到将Word文…...
Java 判断一个字符串在另一个字符串中出现的次数
1.split实现 package com.jiayou.peis.official.account.biz.utils;public class Test {public static void main(String[] args) {String k"0110110100100010101111100101011001101110111111000101101001100010101" "011101100101011010100011111010111001001…...
设计模式十三:代理(Proxy Pattern)
代理模式是一种结构型设计模式,它允许通过在对象和其真实服务之间添加一个代理对象来控制对该对象的访问。代理对象充当了客户端和真实服务对象之间的中介,并提供了额外的功能,如远程访问、延迟加载、访问控制等。 代理模式的使用场景包括&a…...
Redis基础 (三十八)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、概述 1.1 NoSQL 1.2 Redis 二、安装 2.1 安装方式 : 三、目录结构 3.1 rpm -ql redis 3.2 /etc/redis.conf 主配置文件 3.3 /var/lib/redis …...
maven中的scope
1、compile:默认值,可省略不写。此值表示该依赖需要参与到项目的编译、测试以及运行周期中,打包时也要包含进去。 2、test:该依赖仅仅参与测试相关的工作,包括测试代码的编译和执行,不会被打包,…...
【网络基础实战之路】实现RIP协议与OSPF协议间路由交流的实战详解
系列文章传送门: 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 PS:本要求基于…...
CNN(四):ResNet与DenseNet结合--DPN
🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊|接辅导、项目定制 前面实现了ResNet和DenseNet的算法,了解了它们有各自的特点: ResNet:通过建立前面层与后面层之间的“短路…...
汽车EBSE测试流程分析(四):反思证据及当前问题解决
EBSE专题连载共分为“五个”篇章。此文为该连载系列的“第四”篇章,在之前的“篇章(三)”中已经结合具体研究实践阐述了“步骤二,通过系统调研确定改进方案”等内容。那么,在本篇章(四)中&#…...
如何在Spring MVC中使用@ControllerAdvice创建全局异常处理器
文章目录 前言一、认识注解:RestControllerAdvice和ExceptionHandler二、使用步骤1、封装统一返回结果类2、自定义异常类封装3、定义全局异常处理类4、测试 总结 前言 全局异常处理器是一种 🌟✨机制,用于处理应用程序中发生的异常ÿ…...
2023/08/05【网络课程总结】
1. 查看git拉取记录 git reflog --dateiso|grep pull2. TCP/IP和OSI七层参考模型 3. DNS域名解析 4. 预检请求OPTIONS 5. 渲染进程的回流(reflow)和重绘(repaint) 6. V8解析JavaScript 7. CDN负载均衡的简单理解 8. 重学Ajax 重学Ajax满神 9. 对于XML的理解 大白话叙述XML是…...
log_softmax比softmax更好?
多类别分类的一个trick 探讨一下在多类别分类场景,如翻译、生成、目标检测等场景下,使用log_softmax的效果优于softmax的原因。 假设词典大小为10,一个词的ID为9(即词典的最后一个词),使用交叉熵作为损失函…...
[LeetCode - Python]344.反转字符串(Easy);345. 反转字符串中的元音字母(Easy);977. 有序数组的平方(Easy)
1.题目 344.反转字符串(Easy) 1.代码 class Solution:def reverseString(self, s: List[str]) -> None:"""Do not return anything, modify s in-place instead."""# 双指针left,right 0, len(s)-1while left < right:temp s[left]s[…...
【SOP】最佳实践之 TiDB 业务写变慢分析
作者: 李文杰_Jellybean 原文来源: https://tidb.net/blog/d3d4465f 前言 在日常业务使用或运维管理 TiDB 的过程中,每个开发人员或数据库管理员都或多或少遇到过 SQL 变慢的问题。这类问题大部分情况下都具有一定的规律可循,…...
带有参数的 PL/SQL 过程/函数从选择查询返回表
技术标签: 【中文标题】带有参数的 PL/SQL 过程/函数从选择查询返回表【英文标题】:PL/SQL Procedure/function with params to return a table from(of) a select query【发布时间】:2020-12-01 11:17:49【问题描述】: 如何创建带参数的 (…...
文件的权限
1、修改文件的所属者和所属组 2、修改文件某一类人(所属者、所属组、其他人)的权限 一、用户对于普通文件的权限 二、用户对于目录文件的权限 三、访问控制列表ACL 四、特殊权限(了解) wuneng创建了几个文件,xiaoming对…...
vue3集成echarts最佳实践
安装 echarts npm install echarts --save 两种引用方式 非虚拟 dom import * as echarts from echarts;var chartDom document.getElementById(mychart); var myChart echarts.init(chartDom); var option;option {title: {text: Referer of a Website,subtext: Fake Da…...
一位年薪40W的测试被开除,回怼的一番话,令人沉思
一位年薪40W测试工程师被开除回怼道:“反正我有技术,在哪不一样” 一技傍身,万事不愁,当我们掌握了一技之长后,在职场上说话就硬气了许多,不用担心被炒,反过来还可以炒了老板,这一点…...
网络适配器和MAC地址
点对点信道:由于目的地只有一个选项,所以数据链路层不需要使用地址。 而在广播信道中: 各个主机如何判断信号是不是发给自己的? 当多个主机连接在同一个广播信道上,要想实现两个主机之间的通信,则每个主机都…...
react-player静音不能自动播放问题
现象 移动端不能自动播放 原因 取决于您使用的浏览器,但muted如果您不想与autoplay用户交互,则必须使用视频。 Chrome 的自动播放策略很简单: 始终允许静音自动播放。在以下情况下允许自动播放声音: 用户与域进行了交互&#x…...
如何建网站教程视频/公司网络优化方案
Java类的初始化顺序: 若有继承,先初始化父类中的静态和子类中的静态,再初始化父类和子类的构造方法 静态变量(带有static的变量)或者静态代码区—>类中new对象的代码//构造函数 静态最优先,成员变量次…...
旅游商业网站策划书/百度软文
当数据要在网际直接传输的时候,路由器根据IP数据报进行路由.当一台主机要发送数据的时候,其目的主机一般为局域网内的主机或者网外的主机.如果是局域网内的主机,主机发送的以太网帧的头部目的mac地址为目的主机的mac地址,不需要路由.如果是网外的主机,则将数据发到默认的网关,由…...
wordpress弹窗广告/长沙关键词优化公司电话
【出版商】贝哲斯咨询 【免费目录下载】台式杯封口机使用整个过程实现自动化完成,可定量灌装,利用光电定位控制器来确定封口位置,准确无误、生产效率高。塑料复合膜或铝塑复合膜被用来进行自动热封和自动切边,经包装后的产品外形…...
机票最便宜网站建设/站长素材免费下载
目录 1.原理背景 拉普拉斯修正 半朴素贝叶斯 贝叶斯网 scikit-learn实现(GaussianNB,MultinomialNB和BernoulliNB) https://www.cnblogs.com/pinard/p/6074222.html 1.原理背景 贝叶斯公式: 假如我们的分类模型样本是m个样本…...
用织梦做网站能练技术吗/google app
阿甘正传 src url:http://blog.csdn.net/VC_Tony/archive/2010/03/25/5417566.aspx 今天早上看了阿甘正传觉得,我们还是得抽点时间看看电影,特别是像《阿甘正传》这种有韵味的电影,里面的人生哲学真的很值得人们去深思。我已经好…...
wordpress支付配置/太原网站开发
面包屑导航的作用是不言而喻的,现在一般大大小小的网站都会做一个面包屑导航功能,这不仅有益于用户的体验,而且对于百度SEO优化来说也是比较重要的!那么ZBlogPHP网站的面包屑导航该怎样写呢?在网上流传最广泛的一种比较…...