Java 泛型

优质博文:IT-BLOG-CN

一、为什么要有泛型

【1】解决元素存储的安全性问题。
【2】解决获取数据元素时,需要类型强转的问题。

【3】可以统一数据类型,便于操作。
【4】将运行时的异常提前到了编译时,提高了效率。
【5】实现代码的模板化,把数据类型当作参数传递,提高了可重用性。
【6】只要在编译时期没有出现警告,那么运行时期就不会出现 ClassCastException 异常。

public class Demo {//泛型在使用时必须左右一致,不存在继承;public static void main(String[] args) {ArrayList<?> list1 ;ArrayList<String> list2 = new ArrayList<String>();ArrayList<Integer> list3 = new ArrayList<Integer>();ArrayList<Object> list4 = new ArrayList<String>();//泛型在使用时必须左右一致,不存在继承;list1 = list2;list1 = list3;//不会报错,使用了通配符,通配符表示任意类型,这是在使用,把?当成任何一种类型,//?就是任何类型。list2 = list3; //会报错  因为两者在定义时使用泛型,一旦确定了类型就不能够改变类型,//只能是给定的一种泛型类型。}
}

二、泛型类

定义在类上的泛型是在创建对象时确定:

public class MyClass1<E> {/** 定义具有泛型的类* 修饰符 class 类名 <范型变量>{* 范型变量一般用E,K,V,T;* }*///......
}

三、泛型接口

由实现类对象确定

/*泛型接口(接口上含有泛型)格式:public abstract interface 接口名<泛型变量> {}*/
public interface MyInter<T> {//......
}

四、泛型方法

创建在放方法上的泛型是在真正调用方法时确定,一般都由传入的参数确定,包含这个方法的类创建对象时,并不会确定方法上的类型,一定在调用方法时确定。

/*泛型方法(方法上含有泛型)格式:修饰符 <泛型变量> 返回值类型 方法名称(参数列表...) {//...}*/
public class MyClass02<T> {//泛型方法: 泛型E是在方法上自己定义的public <E> E getE(E e){}
}

五、通配符<?>

统配符的使用如下:先说说T和?的区别:基本泛型T是用于定义,将数据类型参数化,不能用于实例化。而 ? 则是在实例化对象时不确定泛型具体参数类型的时候泛指 Object的所有子类型。 但?不能和 Object等效,?是类型实参而不是类型形参,它用于泛指各种类型实参,当具体类型不确定的时候就可以使用?示例如下:

//使用通配符,调用方法时,就可以传入任何类型的list集合
public static void test(List<?> list) {}

六、上下界通配符

上下界通配符其实涉及到 Java 的多态属性,上下转型的可行性,子类实例可以转换成父类实例,但是父类实例却不一定能转换成子类实例,只有本身就是该子类实例向上转型的父类实例才可以向下转型为子类实例。

【1】<? extends A>:可以存放A 及其子类(带有子类限定的可以从泛型读取);

public class EnumTest<T extends B> {public static void main(String[] args) {//可以存放B 及其子类 所以 A 是不行的//EnumTest<A> a = new EnumTest<A>();EnumTest<B> b = new EnumTest<B>();EnumTest<C> C = new EnumTest<C>();}}
class A{};
class B extends A{};
class C extends B{};

【2】<? super A>:可以存放A 及其父类(带有超类限定的可以从泛型写入),在泛型类中是不能进行 super 向上转型的。

//设定通配符的下限这并不少见,在TreeSet集合中就有....我们来看一下
public TreeSet(Comparator<? super E> comparator) {this(new TreeMap<>(comparator));
}

那它有什么用呢?我们想一下,当我们想要创建一个TreeSet<String>类型的变量的时候,并传入一个可以比较 String 大小的Comparator。那么这个 Comparator 的选择就有很多了,它可以是Comparator<String>,还可以是类型参数是 String 的父类,比如说Comparator<Objcet>…这样做,就非常灵活了。也就是说,只要它能够比较字符串大小,就行了。

【界限通配符在集合】 应用时会影响集合的读写行为:
【1】上界<? extends A> 限制了类型上限,只能向上转型,可以读,但是没法写,因为子类型不确定,没法向下转型;
【2】下界<? super A>限制类型的下限,只能向下转型,可以写,但是没法读,因为父类型不确定,没法向上转型。

public class Test {public static void main(String[] args) {//<? extends B> 范围: A类或者A的子类//由于下限不确定,所以无法向下转型至具体类型List<? extends B> list1 = new ArrayList<B>(){{add(new B());}};//list1.add(new B()); //无法添加该类型, 向下转型无法确定目标类型//list1.add(new C());//返回类型 A or BA a = list1.get(0); //正常向上转型//<? super B> 范围: B类或者B的父类//由于上限不确定,所以B类和B类的子类均可以加入,但是B类的父类不行List<? super B> list2 = new ArrayList<>();//list2.add(new A()); //无法向下转型list2.add(new B()); //正常向上转型list2.add(new C());//C c = list2.get(1);//无法向下转型,不加强制转换会报错B b = (B) list2.get(0);C c = (C)list2.get(1);}static class A {};static class B extends A {};static class C extends B {};
}

七、注意事项

1)、静态方法中不能使用类的泛型。
2)、如果泛型类是一个接口或抽象类,则不可创建泛型类的对象。
3)、不能在 catch 中使用泛型。
4)、从泛型类派生子类,泛型类型需具体化。

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

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

相关文章

Day20_网络编程(软件结构,网络编程三要素,UDP网络编程,TCP网络编程)

文章目录 Day20 网络编程学习目标1 软件结构2 网络编程三要素2.1 IP地址和域名1、IP地址2、域名3、InetAddress类 2.2 端口号2.3 网络通信协议1、OSI参考模型和TCP/IP参考模型2、UDP协议3、TCP协议 2.4 Socket编程 3 UDP网络编程3.1 DatagramSocket和DatagramPacket1、Datagram…

小世界网络:直径、分形、同配性

1.小世界网络特点 —— 网络直径接近于网络中节点数量的自然对数 2.小世界分形网络 —— 移除弱链接的小世界网络 3.同配性分析 —— Pearson相关系数、邻居相关度 在宏观层面上&#xff0c;关注平均度、度分布和聚类等全局结构特征的影响。更高的平均度被认为会导致更…

Zookeeper简介及选举机制

1.概述 Zookeeper是一个开源的&#xff0c;分布式的&#xff0c;为分布式框架&#xff08;如下图中的Hadoop和Hive&#xff09;提供协调服务的Apache项目。 工作机制&#xff1a;基于观察者设计模式的分布式服务管理框架&#xff0c;负责存储和管理数据&#xff0c;接受观察者…

[算法沉淀记录] 排序算法 —— 归并排序

排序算法 —— 归并排序 算法介绍 归并排序是一种分治算法&#xff0c;由约翰冯诺伊曼在1945年发明。它的工作原理是将未排序的列表划分为n个子列表&#xff0c;每个子列表包含一个元素(包含一个元素的列表被认为是有序的)&#xff0c;然后重复合并子列表以生成新的有序子列表…

ClickHouse 指南(三)最佳实践 -- 稀疏主索引

在ClickHouse主索引的实用介绍 ClickHouse release 24.1, 2024-01-30 1、简介 在本指南中&#xff0c;我们将深入研究ClickHouse索引。我们将详细说明和讨论: ClickHouse中的索引与传统的关系数据库管理系统有何不同ClickHouse是如何构建和使用表的稀疏主索引的什么是在Clic…

JavaScript原型继承与面向对象编程思想

原型继承与面向对象编程思想 在JavaScript中&#xff0c;原型(prototype)、构造函数(constructor)和实例对象(instance)是面向对象编程中的重要概念&#xff0c;并且它们之间存在着紧密的关系。 原型(prototype)&#xff1a;原型是JavaScript中对象之间关联的一种机制。每个Ja…

js使用import到本js文件中的函数时报错 Error [ERR_MODULE_NOT_FOUND]: Cannot find module

node:internal/process/esm_loader:97internalBinding(errors).triggerUncaughtException(^Error [ERR_MODULE_NOT_FOUND]: Cannot find module D:\桌面\Pagesizedetection\lib\screensize imported from D:\桌面\Pagesizedetection\index.js Did you mean to import ../lib/sc…

网页数据的存储--存储为文本文件(TXT、JSON、CSV)

用解析器解析出数据后&#xff0c;接下来就是存储数据了。数据的存储有多种多样&#xff0c;其中最简单的一种是将数据直接保存为文本文件&#xff0c;如TXT、JSON、CSV等。这里就介绍将数据直接保存为文本文件。 目录 一、Python存储数据的方法 1、 文件读取 2、 文件写入…

【Logback】Logback 日志框架的架构

目录 1、Logger&#xff08;记录器&#xff09; &#xff08;1&#xff09;有效级别和级别继承 &#xff08;2&#xff09;日志打印和日志筛选 &#xff08;3&#xff09;记录器命名 2、Appenders&#xff08;追加器&#xff09; 3、Layouts&#xff08;布局&#xff09;…

npm install 失败,需要node 切换到 对应版本号

npm install 失败 原本node 的版本号是16.9&#xff0c;就会报以上错误 node版本问题了&#xff0c;我切到这个版本&#xff0c;报同样的错。降一下node&#xff08;14.18&#xff09;版本就好了 具体的方法&#xff1a;&#xff08;需要在项目根目录下切换&#xff09; 1. …

泰山派学习笔记(二)一步一步编译SDK文件

上一节&#xff0c;我们安装了基于虚拟机的ubuntu系统&#xff0c;并且建立了samba服务打通了win10和ubuntu系统中的文件传输。本节课我们继续对立创官方提供的SDK文件进行编译&#xff0c;学习编译的方法。引用官方的话&#xff1a;如果只想下载别人编译好的固件并且做一些应用…

Python实战:xlsx文件的读写

Python实战&#xff1a;xlsx文件的读写 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您的订阅和支持~ &#…

图像压缩感知的MATLAB实现(OMP)

前面实现了 压缩感知的图像仿真&#xff08;MATLAB源代码&#xff09; 效果还不错&#xff0c;缺点是速度慢如牛。 下面我们采用OMP对其进行优化&#xff0c;提升速度。具体代码如下&#xff1a; 仿真 构建了一个MATLAB文件&#xff0c;所有代码都在一个源文件里面&#xf…

Unet 高阶分割网络实战、多类别分割、迁移学习(deeplab、resnet101等等)

1、前言 Unet 图像分割之前介绍了不少&#xff0c;具体可以参考 图像分割专栏 为了实现多类别的自适应分割&#xff0c;前段时间利用numpy的unique函数实现了一个项目。通过numpy函数将mask的灰度值提取出来&#xff0c;保存在txt文本里&#xff0c;这样txt里面就会有类似0 1…

力扣精选100道——外观数列(模拟专题)

外观数列算法题链接 &#x1f6a9;了解题意 该题的下面充分的给你说明了这个题目的意思。 3 3 2 2 2 5 1 我们根据我们正常读的顺序读 俩个3 三个2 一个5 一个1 连起来就是 2 3 3 2 1 5 1 这就是最终输出的字符串。 题目开头说了&#xff0c;我们最初是 1开始读…

板块一 Servlet编程:第五节 Cookie对象全解 来自【汤米尼克的JAVAEE全套教程专栏】

板块一 Servlet编程&#xff1a;第五节 Cookie对象全解 一、什么是CookieCookie的源码 二、Cookie的具体操作&#xff08;1&#xff09;创建Cookie&#xff08;2&#xff09;获取Cookie&#xff08;3&#xff09;设置Cookie的到期时间&#xff08;4&#xff09;设置Cookie的路径…

【ArcGIS】利用高程进行坡度分析:区域面/河道坡度

在ArcGIS中利用高程进行坡度分析 坡度ArcGIS实操案例1&#xff1a;流域面上坡度计算案例2&#xff1a;河道坡度计算2.1 案例数据2.2 操作步骤 参考 坡度 坡度是地表单元陡缓的程度&#xff0c;通常把坡面的垂直高度和水平距离的比值称为坡度。 坡度的表示方法有百分比法、度数…

计算机网络面经-TCP三次握手一文说清

目录 说一下TCP的三次握手&#xff1f; 为什么要三次握手&#xff1f;两次行不行&#xff1f;四次呢&#xff1f; 为什么建立连接是三次握手&#xff0c;关闭连接确是四次挥手呢&#xff1f; TCP四次挥手的过程&#xff1f; 如果已经建立了连接&#xff0c;但是客户端突然出…

TSL四次握手

HTTPS 常用的密钥交换算法有两种&#xff0c;分别是 RSA 和 ECDHE 算法。 其中&#xff0c;RSA 是比较传统的密钥交换算法&#xff0c;它不具备前向安全的性质&#xff0c;因此现在很少服务器使用的。而 ECDHE 算法具有前向安全&#xff0c;所以被广泛使用。 1. ECDHE算法 1.…

PostgreSQL如何使用UUID

离线安装时&#xff0c;一般有四个包&#xff0c;都安装的话&#xff0c;只需要开启uuid的使用即可&#xff0c;如果工具包(即 postgresql11-contrib&#xff09;没有安装的话&#xff0c;需要单独安装一次&#xff0c;再进行开启。 开启UUID方法 下面介绍一下如何开启&#…