JAVA30天-高级篇-5-泛型

泛型通配符的基本使用 这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」。 茫茫人海千千万万,感谢这一秒你看到这里。希望我的文章对你的有所帮助! 愿你在未来的日子,保持热爱,奔赴山海! 前言:昨天我们终于讲完了泛型通配符的基本使用, 所以,接下来我们将会对泛型通配符的学习--泛型通配符的高级使用! ????泛型通配符 在我们之前的学习泛型的过程当中,在当我们使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Ob 阅读详情

概念

所谓泛型, 就是允许在定义类、 接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。 这个类型参数将在使用时(例如,继承或实现这个接口, 用这个类型声明变量、 创建对象时) 确定(即传入实际的类型参数, 也称为类型实参)

为什么要有泛型

  1. 解决元素存储的安全性问题, 好比商品、 药品标签, 不会弄错。
  2. 解决获取数据元素时, 需要类型强制转换的问题, 好比不用每回拿商品、 药品都要辨别。

在这里插入图片描述

在集合中使用泛型

ArrayList<Integer> list = new ArrayList<>();//类型推断
list.add(78);
list.add(88);
list.add(77);
list.add(66);
//遍历方式一:
//for(Integer i : list){
//不需要强转
//System.out.println(i);
//}
//遍历方式二:
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("Tom1",34);
map.put("Tom2",44);
map.put("Tom3",33);
map.put("Tom4",32);
//添加失败
//map.put(33, "Tom");
Set<Entry<String,Integer>> entrySet = map.entrySet();
Iterator<Entry<String,Integer>> iterator = entrySet.iterator();
while(iterator.hasNext()){
Entry<String,Integer> entry = iterator.next();
System.out.println(entry.getKey() + "--->" + entry.getValue());
}

自定义泛型结构

概念

  1. 泛型类可能有多个参数,此时应将多个参数一起放在尖括号内。比如: <E1,E2,E3>
  2. 泛型类的构造器如下: public GenericClass(){}。而下面是错误的: public GenericClass<E>(){}
  3. 实例化后,操作原来泛型位置的结构必须与指定的泛型类型一致。
  4. 泛型不同的引用不能相互赋值。尽管在编译时ArrayList<String>和ArrayList<Integer>是两种类型,但是,在运行时只有一个ArrayList被加载到JVM中。
  5. 泛型如果不指定,将被擦除,泛型对应的类型均按照Object处理,但不等价于Object。 经验: 泛型要使用一路都用。要不用,一路都不要用。
  6. 如果泛型结构是一个接口或抽象类,则不可创建泛型类的对象。
  7. jdk1.7,泛型的简化操作: ArrayList<Fruit> flist = new ArrayList<>();
  8. 泛型的指定中不能使用基本数据类型,可以使用包装类替换
  9. 在类/接口上声明的泛型,在本类或本接口中即代表某种类型,可以作为非静态属性的类型、非静态方法的参数类型、非静态方法的返回值类型。但在静态方法中不能使用类的泛型。
  10. 异常类不能是泛型的
  11. 不能使用new E[]。但是可以: E[] elements = (E[])new Object[capacity];(参考: ArrayList源码中声明: Object[] elementData, 而非泛型参数类型数组。)
  12. 父类有泛型,子类可以选择保留泛型也可以选择指定泛型类型:
子类不保留父类的泛型:按需实现
	没有类型 擦除
	具体类型
子类保留父类的泛型:泛型子类
	全部保留
	部分保留
结论:子类必须是“富二代”,子类除了指定或保留父类的泛型,还可以增加自己的泛型

泛型类

class Person<T> {
	// 使用T类型定义变量
	private T info;
	// 使用T类型定义一般方法
	public T getInfo() {
	return info;
	}
	public void setInfo(T info) {
	this.info = info;
	}
	// 使用T类型定义构造器
	public Person() {
	}
	public Person(T info) {
	this.info = info;
	}
	// static的方法中不能声明泛型
	//public static void show(T t) {
	//
	//}
	// 不能在try-catch中使用泛型定义
	//public void test() {
	//try {
	//
	//} catch (MyException<T> ex) {
	//
	//}
	//}
}

泛型方法

  1. 方法,也可以被泛型化,不管此时定义在其中的类是不是泛型类。 在泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据的类型。
  2. 泛型方法的格式: [访问权限] <泛型> 返回类型 方法名([泛型标识 参数名称]) 抛出的异常
    //泛型方法:在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系。
    //换句话说,泛型方法所属的类是不是泛型类都没有关系。
    //泛型方法,可以声明为静态的。原因:泛型参数是在调用方法时确定的。并非在实例化类时确定。
    public <E> List<E> getList(E[] arr){
        ArrayList<E> list = new ArrayList<>();
        for (E item : arr){
            list.add(item);
        }
        return list;
    }

泛型在继承上的体现

* 虽然类A是类B的父类,但是G<A> 和G<B>二者不具备子父类关系,二者是并列关系。
* 补充:类A是类B的父类,A<G> 是 B<G> 的父类
    @Test
    public void test1(){

        Object obj = null;
        String str = null;
        obj = str;

        Object[] arr1 = null;
        String[] arr2 = null;
        arr1 = arr2;
        //编译不通过
//        Date date = new Date();
//        str = date;
        List<Object> list1 = null;
        List<String> list2 = new ArrayList<String>();
        //此时的list1和list2的类型不具有子父类关系
        //编译不通过
//        list1 = list2;
        /*
        反证法:
        假设list1 = list2;
           list1.add(123);导致混入非String的数据。出错。

         */

        show(list1);
        show1(list2);

    }



    public void show1(List<String> list){

    }

    public void show(List<Object> list){

    }

    @Test
    public void test2(){

        AbstractList<String> list1 = null;
        List<String> list2 = null;
        ArrayList<String> list3 = null;

        list1 = list3;
        list2 = list3;

        List<String> list4 = new ArrayList<>();

    }

通配符的使用

通配符:?

* 类A是类B的父类,G<A>和G<B>是没有关系的,二者共同的父类是:G<?>
* 只允许读取(可写入null)
        List<Object> list1 = null;
        List<String> list2 = null;

        List<?> list = null;

        list = list1;
        list = list2;


		
        List<String> list3 = new ArrayList<>();
        list3.add("AA");
        list3.add("BB");
        list3.add("CC");
        list = list3;
        //添加(写入):对于List<?>就不能向其内部添加数据。
        //除了添加null之外。
//        list.add("DD");
//        list.add('?');

        list.add(null);

        //获取(读取):允许读取数据,读取的数据类型为Object。
        Object o = list.get(0);
        System.out.println(o);

注意点

在这里插入图片描述

有限制条件的通配符的使用

* 上限extends:
使用时指定的类型必须是继承某个类,或者实现某个接口,即<=


* 通配符指定下限:
下限super:使用时指定的类型不能小于操作的类,即>=

举例:

<? extends Number> (无穷小 , Number]
只允许泛型为Number及Number子类的引用调用
<? super Number> [Number , 无穷大)
只允许泛型为Number及Number父类的引用调用
<? extends Comparable>
只允许泛型为实现Comparable接口的实现类的引用调用

FreeCAD MCP实战:用自然语言驱动AI建模,效率提升10倍 MCP(Model Context Protocol)是一种让AI模型调用外部工具和数据的协议标准,通过标准化通信层解决AI与CAD软件之间的交互难题。其原理是向AI暴露工具清单,AI根据自然语言需求自动选择工具并填充参数。在工程实践中,这一技术显著降低了CAD建模门槛,将重复性操作从手动点击转为语音指令,适用于批量零件生成、参数化设计等场景。FreeCAD作为开源CAD,凭借开放的Python API和脚本化能力,成为落地MCP的理想平台。本文基于FreeCAD MCP的实操经验,分享环境搭建、自然语言建 阅读详情

相关推荐

MATLAB实战:5分钟搞定雷达信号分选SDIF算法(附完整源码下载)

本文详细介绍了如何在MATLAB中快速实现雷达信号分选的SDIF算法,通过序列差直方图统计高效识别脉冲重复间隔(PRI)。文章包含完整源码下载,从算法原理到实战调优技巧,帮助工程师在5分钟内掌握核心实现方法,显著提升雷达信号处理效率。

info6的博客 614

Java泛型中通配符的使用详解

?extends T>确定了上界为T,那么获取值时类型一定是T或T的父类,但赋值时由于不能确定具体是T或者T的某个子类而赋值失败。

小鲁蛋的博客 8196

Android7以上抓取https数据包-无需root

手机内装一个虚拟机,然后在虚拟机内运行我需要抓包的应用,该虚拟机内是不需要证书验证的。完美解决android7.0以上https无法抓包的问题。

qq_45764684的博客 1454

泛型与通配符的使用

一、泛型可以用<T>、<B,N>、<T extends User>等进行泛型的声明。其中<T extends User>的声明方式限定了T的范围,T只能为 User的子类。1.参数类型用在类的创建中,泛型类。2.参数类型用在接口的创建中,泛型接口。3.参数类型用在方法的创建中,泛型方法。注意泛型<T>的声明位置,在方法的...

diaofang1862的博客 244

Pwntools不只是PWN:用它写个自动化Fuzz脚本,挖掘Linux命令行工具漏洞

本文探讨了如何利用Pwntools构建自动化Fuzz脚本,挖掘Linux命令行工具中的漏洞。通过详细的代码示例和实战案例,展示了Pwntools在Fuzzing中的高效性和灵活性,特别适合快速验证特定场景的安全问题。文章还提供了进阶技巧和避坑指南,帮助安全研究人员快速上手并提升测试效率。

weixin_28718345的博客 220

保姆级教程:用NILMTK和REDD数据集,5分钟跑通你的第一个负荷分解模型

本文提供了一份详细的NILMTK和REDD数据集负荷分解模型教程,适合零基础用户快速上手。从环境准备、数据获取到模型构建和评估,全程仅需5分钟即可完成。特别适合希望快速入门非侵入式负荷分解(NILM)的开发者,涵盖数据预处理、模型训练及结果可视化等关键步骤。

weixin_30493401的博客 441

JAVA泛型,通配符及其使用

JAVA泛型和通配符及其使用

qq_44672113的博客 1100

国科大学习资料--计算机视觉(胡占义、董秋雷)--2018-2019第二学期期末试卷

国科大学习资料–计算机视觉(胡占义、董秋雷)–2018-2019第二学期期末试卷 国科大学习资料–计算机视觉(胡占义、董秋雷)–2018-2019第二学期期末试卷 国科大学习资料–计算机视觉(胡占义、董秋雷)–2018-2019第二学期期末试卷 ...

无名何许人的博客 2165

Java这个泛型高级特性,很多人还没用过!

你知道的越多,不知道的就越多,业余的像一棵小草!成功路上并不拥挤,因为坚持的人不多。编辑:业余草zhenbianshu.github.io推荐:https://www.xttblog.co...

xmt1139057136的专栏 764

08 rk3568 模拟smi mdio RTL8367RB(一)

前提需求:硬件连接普通gpio ,RTL8367RB需要mdio通信 使用的gpio是 MDC GPIO3_B3 (SMI时钟线) MDIO GPIO3_B4 (SMI数据线) 2. 数据结构与枚举 3.1 GPIO 初始化(地址映射) 内核无法直接访问物理地址,通过ioremap将 GPIO 控制器的物理地址映射为虚拟地址,后续通过虚拟地址操作 GPIO 寄存器。 3.2 设置引脚方向 3.3 设置电平 3.4 读取电平 6. SMI 总线时序实现 SMI 总线通信依赖严格的时序(起始信号、

qq_39451352的博客 540

图像做旧算法原理及代码解释

该图像做旧算法主要通过一系列的图像处理操作来模拟旧照片的效果。整体流程包括:首先对输入图像进行颜色调整,降低饱和度并增加黄色调以营造出旧照片的色彩风格;接着添加高斯噪声来模拟旧照片可能存在的颗粒感;最后通过在图像上随机绘制线条来模拟旧照片的划痕和瑕疵。综上所述,该图像做旧算法通过对颜色的调整(包括饱和度降低、色相偏移)、添加高斯噪声以及模拟划痕和瑕疵等一系列操作,从多个方面模拟了旧照片的特征。

m0_44975814的博客 901

java 泛型全解 - 绝对最详细

背景 对于java的泛型我一直属于一知半解的,平常真心用的不多。直到阅读《Effect Java》,看到很多平常不了解的用法,才下定决心,需要系统的学习,并且记录下来。 1、泛型的概述: 1.1 泛型的由来 根据《Java编程思想》中的描述,泛型出现的动机: 有很多原因促成了泛型的出现,而最引人注意的一个原因,就是为了创建容器类。 泛型的思想很早就存在,如C++中的模板(Templates)。...

风吹过wu的博客 7278

AutoClip AI视频剪辑工具:Docker一键部署指南

摘要:AutoClip是一个基于Docker容器化部署的智能视频剪辑系统,采用微服务架构设计,包含Web界面、后端API、异步任务处理和Redis缓存等组件。系统支持一键快速部署,提供完整的监控和日志功能,最低要求4GB内存和10GB存储空间。部署过程仅需三个步骤:克隆代码、配置环境变量、启动容器服务。生产环境支持性能调优、数据持久化和网络安全管理。该系统解决了环境配置难题,实现"一次配置,到处运行"的目标,适合需要自动化视频处理的用户。

wjianwei666的专栏 1001

Java高级之---泛型的使用

一、泛型的概念 1.什么是泛型,看表面的意思,泛型就是指广泛的、普通的类型 2. 所谓泛型,就允许在定义类、接口时通过圆滚滚标识表示类中的某个属性的类型或者某个方法的返回值及参数类型。 这个参数类型将在使用的时候就确定了。 使用泛型有哪些好处 (1)首先就像上面那个例子一样,使用泛型能够限定集合中,如List, Set中元素的类型,保证一个集合中只有一个类型。 (2)程序也能更加健壮(只要在编译时...

执笔诉情殇的博客 2175

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java高级编程之泛型

Java泛型 一、泛型简介 1. 泛型的概念 所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、 创建对象时)确定(即传入实际的类型参数,也称为类型实参)。 从JDK 5.0以后,Java引入了“参数化类型(Parameterized type)”的概念,允许我们在创建集合时再指定集合元素的类型,正如:List,这表明该List只能保存字符串类型的对象。(参数化类型:把类型当做参数来传

哈哈L先生 863

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java_泛型集合的定义及使用

泛型集合的定义及使用 引入 什么是泛型、为什么要引入泛型、泛型类和泛型方法的使用 实例泛型: ​ 创建对象时,为类所定义的泛型,进行参数化赋值。 类:创建对象时,为类所定义的泛型,进行参数化赋值 接口:实现接口时,为接口所定义的泛型,进行参数化赋值 静态泛型: 定义在方法的返回值类型前面:、、<T extends Comparable>、<T extends Comparable<? super T>> 可应用在形参列表、返回值两种场景上,不单单可以规范泛型,还可

Willing卡卡的博客 6715

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java高手的30k之路|面试宝典|精通泛型

泛型|泛型类|泛型接口|泛型方法|通配符|上下界限定|泛型与反射|泛型最佳实践|类型擦除|反射接口ParameterizedType

weixin_41379244的博客 865

Java30天养成计划 || 11 快速上手Java泛型

小白专属的《Java30天养成计划》,一文搞定泛型核心知识点。

冰冻三尺,非一日之寒 257

Java泛型

泛型(Generics)是Java 5引入的特性,它允许在定义类、接口和方法时使用类型参数泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数。// 使用。

qq_45351273的博客 891

java泛型程序示例详解

普通泛型 1 class Point{ // 此处可以随便写标识符号,T是type的简称 2 private T var ; // var的类型由T指定,即:由外部指定 3 public T getVar(){ // 返回值的类型由外部决定 4 return var ; 5 } 6 public

WayneZeng的博客 1739

Java——泛型

Java 的泛型-(参数化类型)jdk1.8现在 泛型:(JDK1.5引入)指的就是在类定义的时候并不会设置类中的属性或方法中的参数的具体类型,而是在类使用时再进行定义。 泛型是jdk5引入的类型机制,就是讲类型参数化。java中的泛型,只在编译阶段有效。 泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型),也就是说在泛型使用过程中。 操作的数据...

qq_43876267的博客 381

java泛型中的问号_详谈Java泛型中T和问号(通配符)的区别

详谈Java泛型中T和问号(通配符)的区别发布于 2020-11-30|复制链接下面小妖就为大家带来一篇详谈Java泛型中T和问号(通配符)的区别。小妖觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小妖过来看看吧类型本来有:简单类型和复杂类型,引入泛型后把复杂类型分的更细了.概述泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种...

weixin_34990053的博客 1352

Java中的泛型<T>类与方法

泛型就是变量类型的参数化。在使用泛型前,存入集合中的元素可以是任何类型的,当从集合中取出时,所有的元素都是Object类型,需要进行向下的强制类型转换,转换到特定的类型。而强制类型转换容易引起运行时错误。 泛型类型参数只能被类或接口类型赋值,不能被原生数据类型赋值,原生数据类型需要使用对应的包装类。 例子一:使用了泛型 1 2 3 4

雨日微风 7万+

java泛型实例化_java基础-泛型举例详解

泛型泛型是JDK5.0增加的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数。这种类型参数可以在类、接口、和方法的创建中,分别被称为泛型类、泛型接口、泛型方法。一、认识泛型在没有泛型之前,通过对类型Object的引用来实现参数的"任意化",但"任意化"带来的缺点是需要显示的强制类型转换,此种转换要求开发者对实际参数类型预知的情况下进行,对于强制转换错误的情况,编译器可能不会提示错...

weixin_39843215的博客 1373

java c 泛型_Java 之 泛型的使用形式

泛型的使用形式有两种:1、泛型类/泛型接口2、泛型方法一、泛型类/接口下面先来看下 JDK1.5改写后的 ArrayList 类、Iterator 接口、Map的代码片段。从上面的代码中,可以看出在定义接口、类时指定类型形参,如上面的E、K、V。当使用这些集合时,就可以为E、K、V指定具体的类型实参。Demo:1 importjava.util.HashMap;2 importjava.util...

weixin_36254379的博客 218
上一篇: JAVA30天-高级篇-6-IO流与网络编程
下一篇: JAVA30天-高级篇-7-反射
zgcadmin
博客等级 码龄9年 174粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值