<-泛型->

1.泛型的概念

所谓泛型,就是允许在定义类, 接口 时通过一个"标识"表示类中某个属性的类型或者某个方法的返回值或形参类型.这个类型参数将在使用时确定.

2.举例

(1). 集合类在设计阶段/声明阶段不能确定这个容器到底存的是什么对象,所以在JDK5.0版本以前,只能把元素类型设计为Object类.JDK5.0时java引入了参数化类型的概念,允许我们在创建集合时指定集合元素的类型.(如List<String>表示该List只能存放String类型的数据.)

使用集合存储数据时,除了元素的类型不确定,其他部分都是确定的.

(2). java.lang.Comparable接口和java.util.Comparator接口,是用于比较对象大小的接口.这两个接口只是限制了当一个对象大于另一个对象时返回正整数,等于返回0,否则返回负整数.但并不确定是什么类型的对象比较大小.jdk5.0之前只能用Object类型表示,即麻烦(可能需要强制类型转换)又不安全(可能比较的两个对象并不是同一类型).故jdk5.0给它们增加了泛型.

3.集合在未使用泛型前可能存在的问题

  • 类型不安全.add(Object obj)形参类型是Object,意味着任何类型的对象都可以被放入到集合中.
  • 需要强转操作,繁琐.还可能出现异常.

4.使用说明

(1). 我们在声明完自定义泛型类后,可以在类的内部(如属性,构造器,方法)使用类的泛型.

public class Order<T>{//泛型类T t;//属性public Order() {}public Order(T t) {//构造器this.t = t;}public T show() {return t;//方法}
}

(2). 我们在创建自定义泛型类的对象时,可以指明泛型参数类型.一旦指明,内部凡是使用类的泛型参数的位置,都具体化为指定的类的泛型类型.

(3). 如果在创建自定义泛型类的对象时,没有指明泛型参数类型,那么泛型将被擦除,泛型对应的类型都按照Object处理,但不等价于Object.

下列是ArrayList的源码,也涉及到了泛型.

524b7347340542ceba5e74b9ee761908.png

2cb59d49f8294c1691e57a48a8cee8a8.png

(4). 泛型的指定类型必须使用引用数据类型,不能使用基本数据类型,此时只能使用包装类.

Order<int> o = new Order<>();//错    Order<Integer> o = new Order<>();//正确

(5). 除了创建泛型类的对象外,子类继承泛型类时,实现类实现泛型接口时,也可以确定泛型结构的泛型参数.如果我们在给泛型提供子类时,子类也不确定泛型的类型,则继续可以使用泛型参数,我们还可以在现有父类的泛型参数的基础上,新增泛型参数.

public class SubOrder<T1, T2> extends Order<String>{T1 data1;T2 data2;
}

5.注意事项

(1). 泛型类可能有多个参数,可以将多个参数都放到尖括号内,如(<T1, T2, T3>).

(2). 从jdk7.0开始,可以简化泛型操作 : 

Order<String> o =new Order<String>();//以前

Order<String> o =new Order<>()//jdk7.0之后.

(3). 如果泛型结构是一个接口或抽象类,则不可以创建对象.//这里其实是接口/抽象类的性质.

(4). 不能使用new T[](因为此时new对象的时候并不知道T的类型,所以无法为其分配内存),但可以使用

T[] element =(T[]) new Object[10];//强制类型转换

(5). 在类/接口上声明的泛型,在本类或本接口中代表某种类型,但不可以在静态方法中使用泛型.(原因也很简单,因为静态方法随着类的加载而加载,而泛型的类型等到创建对象时才能确定,此时泛型的类型还是未知的)

(6). 异常类是不可以带泛型的.

6.泛型方法

这些并不是泛型方法,因为此时的T是泛型类的泛型参数.

//这些都不是泛型方法
public T method3() {//方法体
}
public void method4(T t) {//方法体
}

正确写法

权限修饰符 <E> 返回值类型 method(参数列表){

     //方法体

    //<E>表明E是泛型方法的泛型参数.

}

例 : 

public class GenericityMethhodTest<T> {public static <E> void method1(E[] e, int a, int b) {E temp;temp = e[a];e[a] = e[b];e[b] = temp;}public static <E> void method2(E[] e) {int j = e.length - 1;for (int i = 0; i < (e.length) / 2; i++) {E temp;temp = e[i];e[i] = e[j];e[j] = temp;j--;}}public static void main(String[] args) {Integer[] array =  {1, 2, 3, 4, 5};method1(array, 0, 4);for (Integer i : array) {System.out.println(i);}System.out.println("******************");method2(array);for (Integer i : array) {System.out.println(i);}}}

说明 : 

  • 声明泛型方法时,一定要添加泛型参数<E>.
  • 泛型方法在调用时,需要指明其具体的类型.
  • 泛型类型是可以根据需要来声明为static.则需要在通过类调用该静态方法时指明泛型参数类型.
  • 泛型方法所属的类是否是一个泛型类,其实都可以,因为可能泛型方法的泛型参数与泛型类的泛型参数并不一样.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/814683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序制作圆形进度条

微信小程序制作圆形进度条 1. 建立文件夹 选择一个目录建立一个文件夹&#xff0c;比如 mycircle 吧&#xff0c;另外把对应 page 的相关文件都建立出来&#xff0c;包括 js&#xff0c;json&#xff0c;wxml 和 wxcc。 2. 开启元件属性 在 mycircle.json中开启 component 属…

Vscode远程连接遇到的一些问题

问题&#xff1a; 由于之前报错图片没有保存&#xff0c;所以只有文字描述一下&#xff1a; 1、无法与192.168.8.210建立连接&#xff1a;Vscode服务器启动失败 2、无法与192.168.8.210建立连接&#xff1a;无法安装Vscode服务器 解决方法&#xff1a; 方法一&#xff1a…

Vue输入框/选择框新增状态可编辑,修改状态不可编辑

新增和编辑同页面&#xff0c;新增没有传参&#xff0c;修改状态不可编辑。 在这里我用选择框举例。 思路&#xff1a; 在新增/修改页&#xff0c;先判断是哪种状态&#xff0c;再根据状态不同&#xff0c;选择是否禁用某个选择框。 判断是否有传参&#xff0c;有传参即为修…

baichuan 2模型使用的注意事项

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

51蓝桥杯之DS18B20

DS18B20 基础知识 代码流程实现 将官方提供例程文件添加到工程中 添加onewire.c文件到keil4里面 一些代码补充知识 代码 #include "reg52.h" #include "onewire.h" #include "absacc.h" unsigned char num[10]{0xc0,0xf9,0xa4,0xb0,0x99,…

Unity WebGL Release-Notes

&#x1f308;WebGL Release-Notes 收集的最近几年 Unity各个版本中 WebGL的更新内容 &#x1f4a1;WebGL Release-Notes 2023 &#x1f4a1;WebGL Release-Notes 2022 &#x1f4a1;WebGL Release-Notes 2021

随机链表的复制 - LeetCode 热题 32

大家好&#xff01;我是曾续缘&#x1f4a4; 今天是《LeetCode 热题 100》系列 发车第 32 天 链表第 11 题 ❤️点赞 &#x1f44d; 收藏 ⭐再看&#xff0c;养成习惯 随机链表的复制 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff…

TPS70401系列双输出、低压差线性稳压器(LDO)的数据手册

这份文件是关于德州仪器(Texas Instruments)公司生产的TPS70401系列双输出、低压差线性稳压器(LDO)的数据手册。这些稳压器专为分压供电系统设计,具有集成的系统电压监控器(SVS)功能,适用于需要高电流输出和低静态电流的应用。 以下是这些低压差线性稳压器的核心特点和…

(四)PostgreSQL的psql命令

PostgreSQL的psql命令 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;5777psql 是 PostgreSQL 数据库的命令行界面…

NASA数据集——ACCLIP WB-57 Aircraft 飞机合并数据

ACCLIP WB-57 Aircraft Merge Data ACCLIP WB-57 飞机合并数据 简介 ACCLIP_Merge_WB57-Aircraft_Data 是在亚洲夏季季风化学和气候影响项目&#xff08;ACCLIP&#xff09;期间从 WB-57 飞机上收集的各种现场仪器测量数据预先生成的合并文件。该产品的数据收集工作已经完成。…

【leetcode面试经典150题】28.盛最多水的容器(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

Python Ecosystem之Pandas使用记录

高亮颜色说明&#xff1a;突出重点 个人觉得&#xff0c;&#xff1a;待核准个人观点是否有误 高亮颜色超链接 文章目录 读写excel文件操作问题SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. 二级标题待补充待补充 读写excel文…

设计模式之结构型模式---代理模式

代理模式是一种结构型设计模式&#xff0c;它为目标对象提供一种代理&#xff0c;以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介的作用&#xff0c;客户端通过代理类与目标对象进行交互&#xff0c;而不是直接与目标对象进行交互。 代理模式的应用场景非常…

漫步密度森林:借助HDBSCAN实现高效数据聚类

文章来源&#xff1a;navigating-the-density-forest-harnessing-hdbscan-for-advanced-data-clustering 2024 年 4 月 9 日 介绍 在数据科学中&#xff0c;聚类算法是揭示数据集内在结构的重要工具。在这些工具中&#xff0c;基于分层密度的噪声应用空间聚类 (HDBSCAN) 作为…

一篇文章深入学习Java的AQS(AbstractQueuedSynchronizer)

深入理解AQS的设计和工作机制 Oracle官方文档中的AbstractQueuedSynchronizer部分讲解 AbstractQueuedSynchronizer&#xff08;简称AQS&#xff09;是Java并发包中的一个基础框架&#xff0c;它为实现依赖单个原子变量来表示状态的同步器提供了可靠的基础。这个框架被广泛用…

【leetcode面试经典150题】48. 汇总区间(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

【C++学习】C++11新特性(第一节)

文章目录 ♫一.文章前言♫二.C11新特性♫一.统一的列表初始化♫二.std::initializer_list♫三.声明♫四.decltype关键字♫五.nullptr♫六.新增加容器---静态数组array、forward_list以及unordered系列♫6.1unordered_map与unoredered_set♫6.2array♫6.3 forward_list&#xff…

【Altium Designer 20 笔记】隐藏PCB上的信号线(连接线)

使用网络类隐藏特定类型的信号线 如果你想要隐藏特定类型的信号线&#xff08;例如电源类&#xff09;&#xff0c;你可以首先创建一个网络类。使用快捷键DC调出对象类浏览器&#xff0c;在Net Classes中右击添加类&#xff0c;并重命名&#xff08;例如为“Power”&#xff0…

使用CDN服务对网页加载速度有何影响,如何选择合适的CDN提供商

使用CDN服务对网页加载速度有显著的正面影响。CDN&#xff08;内容分发网络&#xff09;通过将内容缓存到全球各地的服务器节点上&#xff0c;使得用户可以从地理位置上最接近的节点获取数据&#xff0c;从而减少了数据传输的时间和延迟&#xff0c;加快了网页的加载速度。此外…

八大排序算法(面试被问到)

1.八大排序算法都是什么&#xff1f; 八大排序算法有&#xff1a;插入排序、冒泡排序、归并排序、选择排序、快速排序、希尔排序、堆排序、基数排序&#xff08;通常不提&#xff09;。此外&#xff0c;还可以直接调用Arrays.sort()进行排序。 2.八大排序算法时间复杂度和稳定…