JAVA笔记六:泛型程序设计

【泛型】Java中的泛型,泛型类,泛型接口,泛型方法,泛型擦除 这篇文章总结一下Java中的泛型相关知识点,包括:泛型概念、泛型优缺点、泛型通配符、泛型上下界、泛型使用(泛型类、泛型接口、泛型方法)、泛型擦除等内容。 一、泛型概念 (1)什么是泛型 什么是泛型??? 泛型(Generic),是一种参数化数据类型,它允许我们在编写程序代码的时候不用具体指定需要什么数据类型,而是等到具体使用的时候,将数据类型以参数的形式传递给程序,这就是泛型程序设计。 (2)为什么需要泛型 我们来看看下面这个栗子 假设现在有个需求,通过集合保存元素,需要保存String字 阅读详情

一、简单泛型类

1.1 为什么要使用泛型程序设计

泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用。使得程序具有更好的可读性和安全性。

1.2 定义简单泛型类

一个泛型类就是具有一个或多个类型变量的类。

public class Pair<T, U>{...}
private T first;
//类型变量使用大写形式且比较短,使用变量E表示集合的元素类型,K和V分别表示表的关键字与值得类型。
Pair<String> ps = new Pair<Stirng>();

1.3 泛型方法

class ArrayAlg{
	public static <T> T getMiddle(T... a){
		return a[a.length / 2];
	}
}
String middle = ArryAlg.<String>getMiddle("John", "Q.", "Public");
String middle = ArrayAlg.getMiddle("John", "Q.", "Public");//可以省略,由编译器推断,但是有时候需要
//可以在普通类中定义泛型方法

1.4 类型变量的限定

有时候类或方法需要对类型变量加以约束。例如要计算泛型数组内最小元素,需要保证该类型有compareTo方法,可以通过限定实现了ComparaTo接口。
public static <T extends Comparable> T min(T[] a)...//C++则不能对模板参数类型加以限制。注意是Extend,意为绑定
T extends Comparable & Serializable //可以有多个绑定,绑定不只是接口,还可以是类,但是只能有一个类,且排在第一位

二、泛型代码和虚拟机

虚拟机没有泛型类型对象——所有对象都属于普通类。

2.1 类型擦除

无论何时定义一个泛型类型,都自动提供了一个相应的原始类型。无限定用Object,有限定用第一个限定的类型变量。

2.2 翻译泛型表达式

编译器会插入强制类型转换。

2.3 翻译泛型方法

类方法中的泛型类型被擦除后会与多态发生冲突。编译器会在泛型类种生成一个桥方法
Java泛型转换的事实:

  • 虚拟机中没有泛型,只有普通的类和方法
  • 所有的类型参数都用它们的限定类型替换
  • 桥方法被合成来保持多态
  • 为保持类型安全性,必要时插入强制类型转换

2.4 遗留代码问题

@SuppressWarnings("unchecked")//这个注解会关闭对语句或方法中所有代码的检查

三、 约束与局限性

3.1主要阐述Java泛型时需要考虑的一些限制,大多数限制都是由类型擦除引起的。

  1. 不能用基本类型实例化类型参数

  2. 运行时类型查询只适用于原始类型
    a instanceof Pair<String>,getClass()// Pair.class,不会有具体的类型

  3. 不能创建参数化类型的数组
    Pair<String>[] table = new Pair<String>[10] // Error

  4. Varargs警告
    java不支持泛型类型的数组,单数可以向参数可变的方法传递一个泛型类型的实例。但是会得到一个警告。有两种方法可以抑制这个警告。

    //@SuppressWarnings("unchecked")//1
    //@SafeVarags//2
    public static<T> void addAll(Collection<T> coll, T...ts){
    	for(T t: ts) coll.add(t);
    }
    
  5. 不能实例化类型变量
    即在泛型类或者方法内部不能使用new T()

  6. 不能构造泛型数组
    public static <T extends Comparable> T[] minmax(T[] a) {T[] mm = new T[2] ;...} // Error,类型擦除

  7. 泛型类的静态上下文中类型变量无效
    禁止使用带有类型变量的静态域和方法

    public class Singleton<T>{
    	private static T singleInstance; // Error,类型擦除后就剩下一个Object静态变量,不能为每个泛型生成一个静态变量
    }
    
  8. 不能抛出或捕获泛型类的实例
    泛型类不能拓展Throwable接口public class Problem<T> extends Exception {...} // Error
    但是使用类型变量是允许的
    publicstatic <T extends Throwable> void doWork(T t) throws T // OK

  9. 可以消除对受查异常的检查
    @SuppressWarnings("unchecked")//这个注解会关闭对语句或方法中所有代码的检查

  10. 注意擦除后的冲突

3.2 泛型类型的继承规则

泛型与Java数组之间的重要区别。可以将Manager[]数组赋给一个类型为Employee[] 的变量。但泛型不行。
注意继承范例可以参照List与ArrayList。

3.3 通配符类型

  1. 概念,通配符类型中,允许类型参数变化。
    Pair<? extends Employee>//表示泛型Pair类型,它的类型参数是Employee的子类,如Pair<Manager>,但不是Pair<String>

  2. 通配符的超类型限定
    通配符限定与类型变量限定十分类似,但是,还有一个附加能力,可以指定一个超类型限定。
    ? super Manager//这个通配符限制为Manager的所有超类型
    直观地讲,带有超类型限定的通配符可以向泛型对象写入,带有子类限定的通配符可以从泛型对象读取。

  3. 无限定通配符

    Pair<?>
    ? getFirst()
    void setFirst(?)//Pair<?>和Pair本质不同在于,可以用任意Object对象调用原始Pair类的setObject方法
    
    public static <T> void swapHelper(Pair<T> p){ // 通配符捕获样例
    T t = p.getFirst();
    p.setFirst(p.getSecond());
    p.setSecond(t);
    }
    public static void swap(Pair<?>p) { swapHelper(p); }
    
  4. 通配符捕获
    交换元素时需要暂存中间变量,但是不能使用?作为一种类型,因此需要用泛型来作为中间函数捕获。

四、反射与泛型

反射允许你在运行时分析任意的对象。如果对象是泛型类的实例,关于泛型类型参数则得不到太多信息,因为它们会被擦除。

实验六 异常处理、泛型程序设计 要求: 在原有学生管理系统中,针对读文件、类型转换、数组等操作引入异常处理机制; 编写一个表示某门课程成绩的泛型类 class CourseScore,属性包括课程的编号和成绩。 要求:成绩可以是百分制,也可以是A-E(分别以字符串和枚举类型两种手段表示A-E)。 立即下载

相关推荐

实验七:Java集合与泛型

本次实验掌握了集合的概念、体系结构、分类及使用场景,了解了Set接口及主要实现类(HashSet、TreeSet),了解了解List接口及主要实现类(ArrayList、LinkedList、Vector),掌握ArrayList的使用及其与Vector的区别,了解了Map接口及主要实现类(HashMap、TreeMap、HashTable),掌握了掌握HashMap的使用及与HashTable的区别等。

C++入门泛型编程介绍

目录函数模板函数模板格式函数模板的实例化补充:类模板类模板的定义格式类模板的实例化 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础 函数模板 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。 函数模板格式 template<typename T1, typename T2,......,typename Tn> 返回值类型 函数名(参数列表){} 用不同类型的参数使用函数模板时,称为函数模板的实例.

m0_53421868的博客 9612

基于深度学习实现实时视频目标检测

实时视频目标检测是计算机视觉领域的研究热点之一,其应用场景包括智能监控、自动驾驶、机器人视觉等多个领域。深度学习技术的快速发展使得实时视频目标检测变得更加可行和准确。本文提出一种基于深度学习实现的实时视频目标检测系统,使用Python和OpenCV作为开发工具,具有高效、准确和实时的特点。 本系统的主要需求是实现实时视频目标检测功能,可以在不同的应用场景中使用。具体的需求如下:2.1 视频输入本系统需要从摄像头或视频文件中获取实时视频流,并对视频流中的目标进行检测和跟踪。2.2 目标检测本系统需要使用深度学

分享毕业设计的案例和论文 1940

八、泛型程序设计

一、为什么使用泛型设计 使用泛型机制编写的程序代码要比那些杂乱地使用 Object 变量,然后再进行强制类型转换的代码具有更好的安全性和可读性。 在 Java 中增加范型类之前, 泛型程序设计是用继承实现的。ArrayList 类只维护一个 Object 引用的数组: 这种方法有两个问题。当获取一个值时必须进行强制类型转换;此外,这里没有错误检査。可以向数组列表中添加任何类的对象。 ...

王文萱的博客 2007

STC8G1K08A的10位PWM避坑指南:为什么你的占空比调节总失效?(附寄存器操作时序图)

本文深入剖析了STC8G1K08A单片机10位PWM功能中占空比调节失效的核心原因,揭示了数据手册未明确指出的寄存器操作时序陷阱。通过对比错误与正确配置的波形,文章指出关键在于更新占空比高2位前需临时关闭PWM输出,并提供了经过验证的安全操作宏与函数库,帮助开发者彻底解决此问题,实现0%-100%的平滑控制。

yyy34的博客 747

大语言模型在建筑规范自动化合规审查中的微调策略与规模效应实践

大语言模型(LLM)通过在海量文本数据上预训练,具备了强大的语言理解和生成能力。其核心原理是基于Transformer架构,通过自注意力机制捕捉长距离依赖关系。在工程实践中,为了将这种通用能力适配到建筑、法律、金融等高度专业化的垂直领域,通常需要采用领域微调技术。微调通过使用特定领域的高质量指令数据对模型参数进行更新,使其掌握专业术语、逻辑规则和任务范式,从而解决通用模型在专业场景下知识匮乏和“幻觉”问题。结合检索增强生成(RAG)技术,将动态外部知识库作为模型的“参考手册”,能进一步提升事实准确性并降低幻

weixin_30667831的博客 362

java泛型程序示例详解

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

weixin_30585437的博客 257

张正友标定法_单目-线激光三维扫描系统中光刀平面的标定

单目-线激光三维扫描系统中光刀平面的标定线结构光有结构简单、精度高、测速快等特点,被广泛应用于三维重建领域。线结构光三维扫描系统由一个相机和一个线结构光投射器构成,线结构光投射器将线结构光投射到被测物体表面,相机采集带有线激光的被测物体图像,根据相机和线激光投射器间的相对位置关系,使用激光三角法计算出激光线上的点在相机坐标系下的坐标。激光三角法原理如下图所示,线激光投射的扇形区域可以看作是一个平面...

weixin_39616379的博客 1074

Java泛型详解:Java泛型集合、泛型类、泛型方法、泛型的使用

在 Java 1.5 之前没有泛型,通常需要使用强制类型转换的方式将一种数据类型转换为另一种数据类型,这种转换要求开发者对实际参数的类型具有可预知性。对于强制类型转换错误的情况,编译器可能不会提示错误,但是在运行时会出现异常,这是一个安全隐患。 为了解决这一隐患,从 Java 1.5 开始提供了泛型。泛型可以在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。本节将详...

jijiangpeng的博客 7427

Transformer-Based Attention Networks for Continuous Pixel-Wise Prediction 基于Transformer注意力网络连续像素级与估计

Transformer-Based Attention Networks for Continuous Pixel-Wise Prediction 基于Transformer注意力网络的连续的像素级的

MengYa_Dream的博客 4715

Kill5.37版本下,使用ARMcomplier6编译__asm 函数报错的问题

Kill5-5.37版本下,使用ARMcomplier6编译__asm 函数报错的问题 问题简要描述: 昨日更新了keil5软件的版本,从5.17更新到了5.37版本,然后编译STM32项目文件时,软件提示编译报错。报错问题如下: Build started: Project: QKsoftware *** Using Compiler 'V6.18', folder: 'E:\MDK-ARM\ARM\ARM\ARMCLANG\Bin' Build target 'QKsoftware' compiling

weixin_43644424的博客 1万+

Java学习笔记——泛型

示例代码定义了一个泛型类 MyArrayList,该类封装了一个 ArrayList 对象,并提供了 add 和 remove 方法来添加和移除元素。方法接收一个泛型数组 T[] names,其中 T 可以是任何对象类型。首先定义了一个父类Car,三个子类车的品牌“BYD”、“XIAOMI”、“WL”,然后还要定义一个go方法是实际的比赛。这样就可以接收任何类型的参数以及返回任何类型的结果。类型变量建议用大写的英文字母,常用的有:E、T、K、V等。”,可以在“使用泛型”的时候代表一切类型;

weixin_44456914的博客 1937

FC7300 SPI MCAL配置引导

Example - QMI8A01z外设:Example - QMI8A01z外设:

舊梦的博客 257

Java泛型入门篇: 泛型类、泛型接口以及泛型方法

专栏文章导航 Java泛型入门篇: 泛型类、泛型接口以及泛型方法 Java泛型进阶篇: 无界通配符、上界通配符以及下界通配符 Java泛型原理篇: 类型擦除以及桥接方法 文章目录前言1. 什么是泛型2. 泛型的使用泛型类使用方法泛型类继承泛型接口使用方法泛型接口实现类泛型方法使用方法静态泛型方法所属类为泛型类/泛型接口 前言     我们在平时的开发当中基本上无时无刻都在使用泛型,尤其是涉及到集合、多态或自定义类的场景,可以说是泛型是一个十分重要的特性。但包括我在内的大多数人,对泛型的掌握不够深刻,.

笔墨的专栏 4203

本文将详细介绍如何在 Qt (C++) 应用程序中集成 osgEarth,加载三维数字地球,并在指定经纬度添加三维模型(如飞机、建筑等)。

OSG 与 Qt 的交互通常需要处理 OpenGL 上下文。osgEarth 3.x 提供了对 Qt 的较好支持,或者可以使用。在普通 OSG 程序中,你需要手动处理坐标系转换将经纬度转为笛卡尔坐标 (XYZ)。这是实现的关键,将 OSG 的渲染循环集成到 Qt 的事件循环中。第三方库,但在本教程中,我们将展示一种通过继承。,将 Qt 的输入事件转换为 OSG 理解的。事件,这是实现交互(旋转地球、缩放)的基础。来嵌入 OSG 视图的标准方法。在这里我们初始化地球并添加模型。节点简化了这一过程。

qq_45859163的博客 1044

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java泛型详解:为什么使用泛型?如何使用泛型?

大家好!,今天我将为大家介绍一个非常有趣的话题——泛型。作为Java语言中的一项重要特性,泛型可以让我们编写更加通用和灵活的代码。无论您是刚入门Java编程,还是已经有一定经验的开发者,了解泛型都对您的编程能力有所帮助。本文将深入探讨泛型的实现原理和本质,帮助您更好地理解并应用泛型。现在就让我们一起来探索吧!

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 8380

SAP B1中文培訓教材_SDK

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

java学习笔记11——泛型

总结:1.自定义泛型类\接口1.1 格式1.2 使用说明① 我们在声明完自定义泛型类以后,可以在类的内部(比如:属性、方法、构造器中)使用类的泛型。② 我们在创建自定义泛型类的对象时,可以指明泛型参数类型。一旦指明,内部凡是使用类的泛型参数的位置,都具体化为指定的类的泛型类型。③ 如果在创建自定义泛型类的对象时,没有指明泛型参数类型,那么泛型将被擦除,泛型对应的类型均按照object处理,但不等价于object。- 经验:泛型要使用一路都用。要不用,一路都不要用。

qq_58956810的博客 1221

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

假人有限元模型

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

Java泛型程序设计

描述:不可以定义Pair[] pairs = new Pair[10];原因:类型擦除以后变为Pair[] pars = new Pair[10];然后我们可以赋予pairs[0] = new Pair();没有编译错误,但存在运行时错误。解决方法:使用ArrayList,ArrayList pairs = new ArrayList();

gghhb12的博客 806

Java泛型——为何要有泛型

对于String类类型来说,它是继承自Object的,而Integer的直接父类是Number,因此会有Integer无法转String的错误。泛型类是在实例化类的时候指明泛型的具体类型,那么泛型方法就是在调用方法时指明泛型的具体类型。在实现传入泛型实参的泛型接口的实现类定义中,实现类即使不声明泛型,也不会编译错误。在实现未传入泛型实参的泛型接口的实现类定义中,实现类要声明泛型,否则会编译错误。为了避免这样可能的错误,引入泛型,使编译器在编译阶段就提示不匹配的类类型。方法返回了一个更加特定的返回类型。

xiaovie的博客 1710

Java:泛型

本文主要介绍了Java中泛型的概念,泛型类、泛型接口、泛型方法的定义与使用,泛型在父子继承关系上的表现以及泛型的擦除。供个人学习使用。

专注Java和MySQL领域知识分享 1099

【Java笔记】泛型

本文涉及泛型概述、泛型使用举例、自定义泛型结构、泛型在继承上的体现、通配符的使用等内容。

十八岁讨厌编程的博客 2393

《Java面向对象程序设计》学习笔记——第 13 章 泛型与集合框架

Java 提供了实现常见数据结构的类,这些实现数据结构的类通称为 Java 集合框架。 在 JDK1.5 后, Java 集合框架开始支持泛型,本章首先介绍泛型,然后讲解常见数据结构类的用法。

奇妙方程式的博客 2530

【Java】关于Java泛型,为你做最全面的泛型介绍

泛型(Generics)是Java语言中的一个重要特性,它提供了类型安全和代码重用的机制。泛型起到的作用包括类型安全、代码重用、程序设计抽象、集合框架的增强、减少强制类型转换。在面向对象编程和设计模式中有广泛的应用。

✈ 正在努力 の 寒江(StudiousTiger) ✌ 呐 ✈ 1071

Java泛型程序设计(持续更新)

泛型程序设计意味着编写的代码可以对应多种不同类型的对象重用,比如你一一定不希望为收集到的String,File对象分别编写不同的类。编译器还知道ArrayList<String>的add方法有一个String的参数,这比有一个可以包含万物的Object类型的参数要安全的多,现在编译器就可以检查,防止你插入错误的对象。泛型类可以有多个类型变量。//2.此外,这里没有错误检查,我们可以向数组列表中添加任何类的值,我们定义的files只想插入文件类型但是我们定义一个Student类型之后也可以插入。

iov_a的博客 859

Java 泛型-泛型类、泛型方法、泛型接口、通配符、上下限

泛型:         一种程序设计语言的新特性,于Java而言,在JDK 1.5开始引入。泛型就是在设计程序的时候定义一些可变部分,在具体使用的时候再给可变部分指定具体的类型。在Java中泛型主要体现在泛型类、泛型方法和泛型接口中。 泛型类:         当一个类要操作的引用数据类型不确定的时候,可以给该类定义一个形参。用到这个类的时候,通过传递类型参数的形式,来确定要操作的具体的对象

蔡先生的专栏 1万+

java泛型——泛型类、泛型方法、泛型接口

泛型Java 泛型Java 泛型是什么泛型类泛型类的格式泛型类举例泛型方法泛型方法的格式泛型方法举例泛型接口泛型接口的格式泛型接口举例 Java 泛型 Java 泛型是什么 官方定义: 泛型是Java SE 1.5的新特性,泛型的本质就是参数化类型,也就是说所操作的数据类型被指定为一个参数 这种参数类型可以用在类、接口和方法的创建中,分别成为泛型类、泛型接口、泛型方法 优缺点: ​ 优点:可以不用再类型转换了 ​ 缺点:降低了代码的可读性 泛型类 泛型类:当一个类要操作的引用数据类型不确定的时候,可

一个小小的码农 6578
上一篇: JAVA笔记五:异常、断言、日志
下一篇: JAVA笔记七:集合
张小飘
博客等级 码龄11年 9粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值