对泛型的理解

【python】epub的电子书繁体字与简体字转换 中文繁体与简体转换 阅读详情

概述:

集合中是可以存放任意对象的,只要把对象丢进集合后,那么这时他们都会被提升成Object类型。当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换。

举例:

  public static void main ( String[] args ) {
        ArrayList list = new ArrayList();
        list.add("abc");
        list.add("itcast");
        list.add(5);     //由于集合没有做任何限定,任何类型都可以给其中存放
        Iterator it = list.iterator();
        while (it.hasNext()) {        //需要打印每个字符串的长度,就要把迭代出来的对象转成String类型
            String str = (String) it.next();
            System.out.println(str);
        }
    }
}

则会出现以下情况:

abc
itcast
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    at Day13.Demo02.main(Demo02.java:22)

Process finished with exit code 1

程序在运行时发生了java.lang.ClassCastException

类型转化异常:

由于集合中什么类型的元素都可以存储。导致取出时,如果出现强转就会引发运行时ClassCastException异常。
我们知道在前面学习数组时,只要数组定义好,那么这时给数组中存放的数据类型就确定,这时如果给数组中存放的数据类型和数组类型不一致,编译时就会报错。
JDK1.5以后,出现了解决方案,使用容器时,必须明确容器中元素的类型。这种机制称之为 :泛型。

泛型格式:

<数据类型>,这种格式不是很难理解,<>尖括号也是括号,往括号里面写东西其实就是在传递参数。

泛型这种机制的好处:

1,安全机制。

2,将运行时期的ClassCastException,转移到了编译时期变成了编译失败。

3,泛型技术,是给编译器使用的技术。

4,避免了强转的麻烦。

public static void main ( String[] args ) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("abc");
        list.add("itcast");
        list.add("5");     //由于集合没有做任何限定,任何类型都可以给其中存放
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {        //需要打印每个字符串的长度,就要把迭代出来的对象转成String类型
            String str =  it.next();
            System.out.println(str);
        }
    }
}

结果如下:

abc
itcast
5

Process finished with exit code 0

泛型通配符

无法确定具体集合中的元素类型是什么,就可以使用泛型的通配符机制来完成。

当使用泛型类或者接口时,传递的具体的类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符机制后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。通常这样来写:List<?>list。

泛型限定

想要对被打印的集合中的元素类型进行限制,只在指定的一些类型,进行打印。怎么做呢?要解决这个问题,我们就要学习泛型限定

对泛型界限的理解

我们定义一个Box,现在我们想象里面可以装水果那我们就可以这样写

Box<Fruit>  box=Box<Apple>(new Apple)

不过这样的写是不行的,编译器会报错所以就会有

限定泛型的上限:? extends E:接收E类型或者E的子类型。当然有上限,
肯定也有泛型的下限:? super E:接收E类型或者E的父类型。

现在我们把上面的 Box 定义改成:
Box<? extends Fruit>
这就是上界通配符, 这样 Box 及它的子类如 Box 就可以赋值了。
Box<? extends Fruit> box = new Box<Apple>(new Apple)

其中蓝色代表Box<? extends Fruit> box

上界代表只能取树的叶子,只能取外围不能往里放

<? super Fruit>上界通配符对应黄色区域

表示想要放这个水果必须有盒子能实现水果的基类,也就是意思说要实现多态。能放食物的盒子可以去放水果,放水果的盒子重写了食物的放的内容。

也就是所在叶子的必须有一个根,叶子就是你想去实现的内容。

使用场景

在使用泛型的时候可以遵循一些基本的原则,从而避免一些常见的问题。

在代码中避免泛型类和原始类型的混用。比如List和List不应该共同使用。这样会产生一些编译器警告和潜在的运行时异常。当需要利用JDK 5之前开发的遗留代码,而不得不这么做时,也尽可能的隔离相关的代码。

在使用带通配符的泛型类的时候,需要明确通配符所代表的一组类型的概念。由于具体的类型是未知的,很多操作是不允许的。

泛型类最好不要同数组一块使用。你只能创建new List<?>[10]这样的数组,无法创建new List[10]这样的。这限制了数组的使用能力,而且会带来很多费解的问题。因此,当需要类似数组的功能时候,使用集合类即可。

不要忽视编译器给出的警告信息。

PECS 原则

如果要从集合中读取类型T的数据, 并且不能写入,可以使用 上界通配符(<?extends>)—Producer Extends。

如果要从集合中写入类型T 的数据, 并且不需要读取,可以使用下界通配符(<? super>)—Consumer Super。

如果既要存又要取, 那么就要使用任何通配符。

 

【验证技能树】UVM 源码解读01 -- UVM本质上就是软件工程方法论在芯片验证领域的应用 文章摘要: UVM(通用验证方法学)是基于SystemVerilog的芯片验证框架,采用组件化、面向对象和事务级抽象设计。其核心在于职责分离与数据流,通过Driver、Monitor、Sequencer等模块协作实现高效验证。UVM强调复用性、可扩展性和可维护性,类似软件工程的模块化与低耦合原则。理解其体系结构比记忆API更重要,有助于灵活组合组件并提升验证效率。UVM不仅是工具,更融合了软件工程思维,推动验证工作向自动化、系统化发展。掌握UVM底层逻辑能优化验证环境设计,适用于从IP到SoC的多层级验证场 阅读详情

相关推荐

【开关】刀开关矩阵(Pole Switched Matrix)的结构讨论

矩阵主要有交叉点矩阵和树形矩阵两种矩阵结构。 交叉点矩阵是由SPST继电器排列成简单的网格形式的阵列组成;树形矩阵是由树形的多路复用模块组成,为需要高频RF带宽的应用提供解决方案。在搭建这些矩阵的同时,也限制了可提供的连接性。这也是为什么有的矩阵是简单的交叉点矩阵,而有的矩阵的交叉点中嵌入隔离继电器用来提供中间带宽的矩阵。 但是,Pickering Interfaces提供的另外一种矩阵类型其...

Tina的博客 4407

泛型的详解

泛型的使用

qq_48747560的博客 3728

【CTFSHOW】web入门 黑盒测试

文章目录写在前面web380web381web382web383web384web385web386web387web388web389web390web391web392web393web394web395参考资料 写在前面 一直没搞过渗透,先学学黑盒测试吧 web380 进入题目发现是一个关于灯泡的悲伤故事,点进去,看到跳转到page_1.php页面。 我们访问page.php试试: 发现报错:$id.php,可以猜想需要传名称为id的参数,来访问id.php。我们访问page.php?id=1试试

7ruth0hn的博客 1897

泛型的讲解

泛型的讲解

yyhgo_的博客 2495

AUTO-DL平台快速部署BEVFormer:Nuscenes数据集完整训练避坑指南

本文详细介绍了在AUTO-DL平台高效部署BEVFormer模型并利用Nuscenes数据集进行完整训练的实战指南。重点解析了平台数据管理、环境配置、数据集迁移解压、预处理及训练启动等全流程中的关键步骤与常见避坑技巧,帮助研究者和工程师快速复现这一前沿视觉感知模型,节省云端训练时间与成本。

weixin_29188043的博客 332

【顾邦小讲堂】第十九期 RC Snubber吸收电路详解:抑制MOSFET振铃现象与过冲的设计技巧!

通过RC Snubber电路有效抑制MOSFET DS端的过冲及振铃现象,帮助工程师们在设计中提升电路的稳定性和可靠性

GBupupup的博客 3789

什么是泛型?

原文链接:什么是泛型?_怎样让大排不硬的博客-优快云博客_泛型 如需查看更多内容请关注原作者 一、什么是泛型 泛型:就是指在类定义时不会设置类中的属性或方法参数的具体类型,而是在类使用时(创建对象)再进行类型的定义。会在编译期检查类型是否错误。 类声明后的<>中这个T被称为类型参数,用于指代任意类型,实际上这个T只是个代表,写什么都可以。表示此时的value1,value2都是在类定义时没有明确类型,只有在使用时才告知编译器类型。出于规范,类型参数用单个的大写字...

qq_44885775的博客 3384

PyWxDump实战:解密微信PC端本地数据库,实现聊天记录备份与分析

数据加密是保护敏感信息(如聊天记录)的核心技术,它通过特定算法将明文转换为密文,确保数据在存储和传输过程中的机密性。SQLCipher作为SQLite的加密扩展,采用AES-256算法对数据库文件进行页级加密,广泛应用于移动端和桌面端应用的数据保护。其技术价值在于,在保障用户隐私的前提下,为合规的数据备份、归档与分析提供了底层支持。在数据恢复、司法取证或合规审计等场景中,获取并解析此类加密数据是关键步骤。PyWxDump正是针对微信PC端本地SQLCipher加密数据库设计的工具,它通过逆向工程分析内存结构

450

什么是泛型

什么是泛型

程序员思维的博客 2940

【网络安全 | 渗透工具】Githack工具安装及使用教程详析

本文仅分享Githack工具基本安装及使用相关知识不承担任何法律责任。Git是一个非常流行的开源分布式版本控制系统,它被广泛用于协同开发和代码管理。许多网站和应用程序都使用Git作为其代码管理系统,并将其部署到生产环境中以维护其代码库。然而,在配置不当的情况下,可能会导致.git文件夹被直接部署到线上环境中,这可能会导致Git泄露问题。可通过githack下载泄露的Git存储库,以获取包含未加密密码、凭据和敏感信息的站点代码库。使用githack下载Git存储库的方法有两种。本文仅分享。

等风来 3万+

37、OpenMP:并行编程的强大工具

本文详细介绍了 OpenMP 的核心功能和使用方法,包括执行环境例程、线程同步与协调机制,如关键区域、屏障、原子操作、归约子句、刷新构造和锁机制。此外,还提供了多个实践练习,涵盖矩阵乘法的并行实现、任务池与流水线模式的应用、读写锁的扩展与移植,以及客户端-服务器模式的实现与优化。通过这些内容,读者可以全面掌握 OpenMP 在并行编程中的实际应用与性能优化技巧。

www00的博客 105

Java 中的泛型(两万字超全详解)

博主将用 优快云 记录 Java 后端开发学习之路上的经验,并将自己整理的编程经验和知识分享出来,希望能帮助到有需要的小伙伴。博主也希望和一直在坚持努力学习的小伙伴们共勉!唯有努力钻研,多思考勤动手,方能在编程道路上行至所向。由于博主技术知识有限,博文中难免会有出错的地方,还望各位大佬包涵并批评指正,博主会及时改正;如果本文对小伙伴你有帮助的话,求求给博主一个赞支持一下,可以一起交流,一起加油!!Java泛型详解,史上最全图文详解java 泛型全解 - 绝对最详细Java 泛型,你了解类型擦除吗。

林二月的博客 11万+

多思计组实验实验六 微程序控制器实验

实验六 微程序控制器实验

qq_53089329的博客 3785

关于泛型的认识和理解

今天学习了泛型的知识,以前在看毕向东老师的视频时,开始提到泛型,我的理解以为是上帝类Object呢。 今天看完高新视频后,对泛型有了新的理解。于是找了泛型的知识的特点。 在Java1.5后引入了泛型的概念。  泛型的本质是参数化类型,也可以说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。      泛型的好处: 1.

ilosing的专栏 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

关于泛型的理解

** 什么叫泛型? ** 个人理解是把重复的类进行一个整合防止类型膨胀,成员膨胀? 在定义一个类,接口,方法等的时候不定义数据类型用 <类型参数> 等要使用的时候再写上数据类型。 什么叫类型参数? 是指一个泛化的类型,用一个标识符来表示,标识符是由自己命名。 泛型有正交性?(感觉就是有许多种泛型):泛型类,泛型接口,泛型委托,泛型方法 例子1 泛型类: static void Main(string[] args) { Apple apple = new

qq_50586453的博客 1584

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

关于泛型的一些理解

什么是泛型 Java泛型(generics)是JDK 5中引入的一个新特性,泛型提供了编译时类型安全监测机制,该机制允许程序员在编译时监测非法的类型。使用泛型机制编写的程序代码要比那些杂乱地使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性。 泛型的本质是参数化类型,即给类型指定一个参数,然后在使用时再指定此参数具体的值,那样这个类型就可以在使用时决定了。 这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。 泛型类 在声明类的时候就指定了参数,

weixin_44844639的博客 205

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

泛型学习——1.理解泛型

忘掉那些复杂的PECS?super T类型擦除为什么要有泛型?为了解决“蛮荒时代”用Object存放一切所带来的类型不安全和繁琐的强制类型转换问题。泛型是什么?它是一种“类型标签”或“类型占位符”机制。它让类或方法可以在定义时不写死具体类型,而是等到使用时再指定。这大大提高了代码的复用性。泛型的好处是什么?类型安全:编译器会帮你检查类型,在编译期就发现错误,防止把“香蕉”放进“苹果盒”。代码简洁:不用再写恶心的(SomeType)强制转换了。可读性好一看就知道这个列表是干嘛的,比List清晰一万倍。

2302_78439400的博客 924

java 泛型怎么理解_Java中泛型的理解

Java中的泛型,本质上来说,就是是参数化类型,就是说所操作的数据类型被指定为一个参数,而不是确定的某种类型。这种数据类型可以用在类、接口和方法创建中。即泛型类、泛型接口、泛型方法。这样说可能不够生动,来举些例子说明一下。例子一我们通过 例子一来简单看看泛型的应用场景。下面的情况中,没有使用泛型:public classFanXingTest {public static voidmain(Str...

weixin_32482133的博客 379

Java泛型的理解

一、泛型的定义 泛型,即“参数化类型”。就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。 一些常用的泛型类型变量: T:代表一般的任何类。 E:代表 Element 的意思,或者 Exception 异常的意思。 N:数字(Number) K:代表 Key 的意思。 V:代表 Valu...

weixin_42046829的博客 245

泛型的上下限要怎么理解

泛型上下限理解,这下忘不了

公众号 Java4ye 2747

泛型方法、及出入参理解

1、泛型方法 public static <T> void installHead(MessageReq<T> msg) { msg.setMsgId("001"); msg.setMsgName("001请求"); } public satic<T> 这个T是个修饰符的功能,表示是泛型方法,就像有static修饰的方法是静态方法一样。 <T> 不是返回值,表示传入参数有泛型。 注意: ...

weixin_40482816的博客 3859

深入理解 Java 泛型

???? 本文已归档到:「javacore」 ???? 本文中的示例代码已归档到:「javacore」 1. 为什么需要泛型 JDK5 引入了泛型机制。 为什么需要泛型呢?回答这个问题前,先让我们来看一个示例。 public class NoGenericsDemo { public static void main(String[] args) { List list = n...

静默虚空的专栏 929

泛型方法的定义和使用_深入理解Java泛型(一.泛型的作用与定义)

点击上方“蓝字”关注我们吧!泛型的作用与定义类型的参数化,就是可以把类型像方法的参数那样传递泛型使编译器可以在编译期间对类型进行检查以提高类型安全,减少运行时由于对象类型不匹配引发的异常。1. 泛型是什么一说到泛型,大伙肯定不会陌生,我们代码里面有很多类似这样的语句:List list=new ArrayList<>();ArrayList就是个泛型类,我们通过设定不同的类型...

weixin_39888180的博客 1万+

学习记录338@泛型<T> T的理解

泛型 T的的写法一般会出现在泛型方法中,如下: package test; public class Test { private Object object; //代表的是方法的返回值类型为T public <T> T method(){ return (T) object; } } 为什么是 T,而不是 T 呢?以下代码会报错 package test; public class Test { private Object ob

教练我想学编程 441

JAVA泛型理解

一. 术语 泛型:声明中具有一个或者多个类型参数的类或者接口,就是泛型; 原生态类型:每一种泛型都定义一个原生态类型(raw type),即不带任何实际类型参数的泛型名称。例如,与List<E>相对应的原生态类型是List。原生态类型就像从类型声明中删除了所有泛型信息一样,他们的存在主要是为了与泛型出现之前的代码相兼容。 二. 理解 从技术的角度来说,像E、List<E>和List<String>这样的类型应称作不可...

zhangweiocp的专栏 366

泛型,通配符,泛型的使用与理解

泛型泛型(eclipse)泛型的定义泛型与继承使用类型通配符:? 泛型(eclipse) 泛型的定义 通常来讲,我们创建一个List集合,什么东西都是可以在里面放的,char也好,int也好,乱七八糟,我们这是常常会看到eclipse的左面显示着黄色的警告,虽然程序员不关心警告,但是去掉警告多少会舒心不是? 泛型,在jdk1.5加入,其主要原理是在类声明时通过一个标识表示类中某个属性的类型或者是某...

undersnowyok的博客 231
上一篇: 比较器Comparator与Comparable是排序接口
下一篇: Collection
Abstract_TOM
博客等级 码龄5年 8粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值