Java中的泛型编程
泛型是JDK1.5后出现的一个安全机制
好处:1.将运行时期出现的问题转移到编译时期。
2.避免了强制类型转换的麻烦
通过<>来指定容器中元素的类型
泛型的思想
消除取用集合元素时代码中的强制类型转换,比如事先规定好一个集合中允许加入的具体元素类型,然后在编译环节实现集合中添加元素的类型检查,以防止有人将非预期类型的元素保存到集合中。
优点
类型错误可以在编译时暴露出来,而不是在运行时才发作(抛ClassCastException),这有助于早期错误排查,并提高程序的可靠性。
使用泛型的Vector类
java.util包里的Vector类的泛型声明:
publicclassVector<E>{
voidadd(Ex);
….
}
Vector<Integer>c=newVector<Integer>();
c.add(15);c.add(newInteger(10));
//c.add("name");
for(inti=0;i<c.size();i++){
Integervalue=c.get(i);System.out.println(value);
}
注意:
(1)JDK5.0后集合类定义像Vector一样都进行了泛型化改造,还有泛型类带有多个类型参数,如Map<K,V>就有两个类型参数,表示键-值映射。
(2)Java语言中的泛型是维护向后兼容的,即我们完全可以不采用泛型,而继续沿用过去的做法。
(3)在高版本开发环境中编译未启用泛型机制的集合类应用代码时,会输出编译提示信息。
当类中操作的引用数据类型不能确定是,就使用泛型类。
类中要操作什么类型的数据不确定,就可以定义一个类型参数。
使用者,传递什么样的类型,那么该类中操作的就是什么类型数据。
classStudent<T>
{ privateStringname;
privateTt;
publicStudent(Stringname,Tt){
this.name=name;
this.t=t;
}
publicTgetT(){
returnt;
}
}
classTestStu{
publicstaticvoidmain(String[]args){
Student<String>stu1=
newStudent<String>("张三","软件学院");
Student<Double>stu2=
newStudent<Double>("李四",95.0);
Stringaddress=stu1.getT();
Doubled=stu2.getT();
System.out.println(address);
System.out.println(d);
}
}
classTestGeneric
{
publicstaticvoidmain(String[]args){
Vector<String>c=newVector<String>();
c.add("aaa");
Vector<Integer>v=newVector<Integer>();
v.add(123);
printC(c);
printC(v);}
staticvoidprintC(Vector<?>c){
Iterator<?>it=c.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
为了更好的在定义泛型类时对类型参数进行限制,泛型机制还允许对类型参数进行附加的约束。
<TextendsPerson>
类型参数为Person类或者Person类的子类
classPerson
{ publicvoidp(){
System.out.println("Person");
}
}
classStudentextendsPerson
{ publicvoidp(){
System.out.println("student");
}
}
classTeacherextendsPerson
{ publicvoidp(){
System.out.println("teacher");
}
}
classTestGeneric2<TextendsPerson>
{privateTt;
publicTestGeneric2(Tt){
this.t=t;
}
publicvoidtestp(){
t.p();}
publicstaticvoidmain(String[]args){
TestGeneric2<Person>tg2=
newTestGeneric2<Person>(newPerson());
tg2.testp();
TestGeneric2<Student>tg3=
newTestGeneric2<Student>(newStudent());
tg3.testp();
TestGeneric2<Teacher>tg4=
newTestGeneric2<Teacher>(newTeacher());
tg4.testp(); }
}
泛型方法:就是将泛型定义在方法上。
泛型定义在类上,该泛型作用于整个类。
将泛型定义在方法上即可让使用泛型的方法操作不同类型数据。
格式:<T>返回类型方法名(Tt)
classTestGeneric3
{
public<T>voidgtest(Tt){
System.out.println(t.getClass().getName());
}
publicstaticvoidmain(Stringargs[]){
TestGeneric3tg=newTestGeneric3();
tg.gtest("");
tg.gtest(tg);
tg.gtest(123);
}
}
静态方法不可以使用类中定义的泛型。
因为类中的泛型需要在对象初始化的时,指定具体类型。
而静态优先与对象存在。
在静态方法上定义泛型,一定要写在static关键字的后面。返回值类型的前边。
classUtil<T>
{
publicvoiddisplay(Tt){
System.out.println(t);
}
}
classTestGeneric4
{
publicstaticvoidmain(String[]args){
Util<String>u=newUtil<String>();
u.display("abc");
}
}
classUtil
{
publicstatic<T>voiddisplay(Tt){
System.out.println(t);
}
}
相关推荐
第五次作业函数第一题--
本项目旨在利用深度学习方法实现作物病害的自动诊断。作物病害是农业生产中的重要问题,及时诊断和处理对于减少产量损失至关重要。 我们采用深度学习算法,通过分析作物的图像,实现对病害的自动识别和分类。项目使用的数据集包括公开的作物病害图像数据集,如ISIC等,并进行了预处理,包括图像增强、分割和特征提取等。 在运行环境方面,我们使用Python编程语言,基于TensorFlow、PyTorch等深度学习框架进行开发。为了提高计算效率,我们还使用了GPU加速计算。此外,我们还采用了Docker容器技术,确保实验结果的可重复性。 项目完成后,将实现对作物病害的快速、准确诊断,为农业生产提供有力支持,有助于减少产量损失。同时,项目成果也可应用于其他图像识别和分类任务。
机械设计CD驱动印刷设备step非常好的设计图纸100%好用.zip
python烟花代码
附件中是一个简单的烟花效果的代码示例: 在Python中,可以使用多种方式来模拟烟花效果,其中一种常用的方法是使用turtle模块,它提供了一个画布和一个小海龟,可以用来绘制各种图形。 这段代码首先导入了turtle模块和random模块,然后在屏幕上绘制了10次烟花爆炸的效果。每次爆炸都是由5个小圆组成,颜色随机选择,圆的大小也是随机的。 请注意,这段代码需要在支持turtle模块的Python环境中运行,并且需要有图形界面的支持。如果你在没有图形界面的环境中(比如某些服务器或者命令行界面),这段代码可能无法正常运行。
商业化产品经理,到底如何实现产品商业化?.docx
Panduit 工业以太网部件内部销售指南
在Java中,实现一个三维装箱(也称为三维背包问题)的算法通常涉及到组合优化和动态规划。这个问题是一个典型的优化问题,其中目标是在三个维度的限制下最大化价值的总和。下面是一个简单的Java代码示例,它使用动态规划来解决三维装箱问题。 请注意,这个代码只是一个简单的示例,它假设所有物品的第三个维度的大小都是1,并且没有给出如何回溯选择物品的完整逻辑。在实际应用中,三维装箱问题可能更加复杂,需要考虑所有三个维度的限制,并且可能需要更复杂的算法来解决。 此外,这个问题的解决方案可能需要根据具体问题的要求进行调整,例如物品是否可以分割、是否允许超过一个的物品等。如果你有特定的问题描述或者需要进一步的帮助,请提供更多的细节。
常用品牌EPLAN部件库
单片机开发的教程可以分为以下几个步骤: 1. 了解单片机基础知识:在学习单片机开发之前,需要了解单片机的相关知识,包括单片机的基本结构、指令系统、编程语言等。 2. 选择开发板:选择一款适合自己学习开发板的型号和厂商,通常需要关注开发板的性价比、开发环境是否友好等因素。 3. 学习开发环境:根据所选的开发板,学习相关的开发环境和使用方法,例如Keil、IAR等集成开发环境。 4. 掌握编程语言:单片机常用的编程语言包括C语言和汇编语言,根据实际情况选择其中一种进行学习。 5. 基础操作:熟悉单片机的引脚定义和IO口配置,了解单片机的启动代码,可以通过修改启动代码进行基本功能调试。 6. 综合实践:根据具体项目需求,进行单片机开发的综合实践。在实践中需要掌握如何编写程序、如何进行硬件调试、如何使用相关工具软件等技能。 下面是一个单片机开发的简单教程介绍: 首先,确定所使用的单片机型号和开发板类型。在这个阶段,需要查阅相关资料,了解开发板的规格书、芯片规格等基本资料。 其次,安装并配置开发环境。根据所选的开发板,安装相应的集成开发环境(IDE),并配置好开发环境。 接着,学习并掌
Q1.ipynb
(自适应手机端)IT网络建站公司pbootcms模板 互联网营销企业网站源码下载.zip
Bematech 激光扫描器用户手册
激励视频接入文档.pdf
java jdk1.8 202版本下载window linux打包
Lite Beam M5快速指南
互联网金融导论.docx
字节跳动青训营——抖音项目
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。