Java基础--泛型详解

news2024/12/26 0:35:41

一、背景

java推出泛型之前,集合元素类型可以是object类型,能够存储任意的数据类型对象,但是在使用过程中,如果不知道集合里面的各个元素的类型,在进行类型转换的时候就很容易引发ClassCastException异常。

二、概念 

java泛型是jdk5中引入的一种新特新,泛型提供了编译时类型安全监测机制,能够在编译期间检查到非法的类型数据结构。其本质就是参数化类型,也就是所操作的数据类型被指定为一个参数。

三、泛型类、接口 

一、泛型类,实例化类的时候指明泛型的具体类型

1、泛型类的定义模版

Class 类名称 <泛型标识,泛型标识,...>{

        private 泛型标识  变量名;

        .............................

}

2、常用的泛型标识:T、E、K、V

3、使用

类名<具体的数据类型> 对象 = new 类名<具体数据类型,jdk1.7后可以是空的>(); 

4、注意 

1、泛型在创建对象的时候,没有指定类型,将按照Object类型来操作

2、泛型类不支持基本数据类型

3、同一泛型类,根据不同的数据类型创建的对象,本质上是同一个类型。都是这个泛型类的对象,只是里面的泛型做代表的类型不同。

二、从泛型类派生子类

1、子类也是泛型类,子类和父类的泛型类型要一致。

Generic<E> // 这里可以是E,但是下面子类和继承父类的泛型需要一致

class  ChildGeneric<T> extends Generic<T>

// 不能子类是T,这里给父类就是E,这表示两个类型是不一致的。原理就是创建子类的时候会先创建父类,如果一致,那么会进行类型传递,告诉父类创建对应类型,如果不一致,将无法得到具体类型。

2、子类不是泛型类,父类要明确泛型的数据类型 

class  ChildGeneric extends Generic<String>

// 这里需要明确父类数据类型,主要是子类不是泛型类型,无法传递给父类,告知父类泛型该是何种数据类型,所以需要在子类明确

三、泛型接口

1、泛型接口的定义模版

interface 接口名称<泛型标识,泛型标识,........>{

        泛型标识  方法名();

        ..........

}

2、使用

1、实现类不是泛型类,接口需要明确数据类型。原理与不是泛型类的子类实现泛型父类一致。如果不明确,默认就是object类型。

2、实现类是泛型类,实现类与泛型接口的泛型类型要一致。

四、泛型方法

一、语法

修饰符 <T,E,.....> 返回值类型   方法名(参数){

        方法体

}

1、修饰符与返回值中间的泛型类型很重要,这个表示声明此方法为泛型方法。

2、  只有在修饰符与返回值中间处声明了<T,E,.....>的方法才是泛型方法,泛型类中使用了泛型的成员方法并不是泛型方法。

3、 <T,E,.....>表示该方法使用泛型,T,E,....,此时才可以在方法中使用对应的泛型类型。

4、如果泛型类上的泛型是T,泛型方法是上面这样声明的,使用的泛型参数也是T,那么在使用时泛型类传入的具体类型,和调用方法时传入的具体类型是没有关系的,相当于这两个T代表的是不同的泛型。也就是说调用时泛型类传入的是Integer,而泛型方法可以传入String,然后用的也是String类型。

5、泛型方法可以使用static,但是泛型类的成员方法,如果使用了泛型类的泛型,则不能使用stiatic,这是因为泛型类型参数是与类的实例相关联的,而不是与类本身相关联的。而static方法是与类相关联的,它们不依赖于类的实例。

public class MyGenericClass<T> {
    private T value;

    public MyGenericClass(T value) {
        this.value = value;
    }

    // 这是一个非静态的泛型方法
    public T getValue() {
        return value;
    }

    // 这是一个静态方法,但不能使用泛型类型参数T
    public static void staticMethod() {
        // 在静态方法中不能引用泛型类型参数T
        // 下面的代码将会编译错误
        // T item = value; // 错误
    }
}
 

在上面的例子中,getValue方法是一个非静态的泛型方法,因为它依赖于类的实例中的泛型参数。而staticMethod是一个静态方法,它无法直接访问泛型类型参数T,因为它与类的实例无关。在静态方法中,你无法访问类的实例变量,因此也无法访问与实例相关的泛型参数T。

二、泛型方法与可变参数 

修饰符  static <E> 返回值类型   方法名(E...  e ){

        方法体

}

五、类型统配符 

一、概述

类型通配符一般是使用“?”代替具体的类型实参,所以通配符是类型实参,而不是类型形参。

二、类型通配符上限

1、语法

类/接口<? extends 实参类型>:要求该泛型的类型,只能是实参类型或者是实参类型的子类类型。

实参形参具体可看:Java方法参数的形参和实参_java 函数 形参-CSDN博客

2、注意

public void test(ArrayList<? extends cat> list){

        1、 这里需要注意 list在方法体内是无法添加元素的,这是由于传入的不知道是cat还是cat的子类,那添加元素就无法确定添加那种数据,假如说传入的是cat的子类A,这个时候我们并不知道,就有可能添加cat的子类B。

        2、这里可以使用cat来接受元素类型

}

三、类型通配符的下限 

1、语法

类/接口<? super 实参类型>:要求该泛型的类型,只能是实参类型或者是实参类型的父类类型。

2、 注意

public void test(ArrayList<? super cat> list){

        1、这里需要注意 list可以在方法体内添加元素,通配符下限并不约束元素类型。

        2、遍历时使用的是Object来接收元素

}

六、类型擦除

一、无限制擦除 

一般是使用除extends的上限通配符,其他的泛型类型都会在编译期间进行类型擦除,将泛型转为Object类型。

二、有限制擦除 

使用了泛型的上限通配符时,在编译期间进行类型擦除,将泛型转为上限类型。

三、桥接方法

七、泛型数组

一、可以声明带泛型的数组引用,但是不能直接创建带泛型的数组对象。例如:

ArrayList<String>[] list = new ArrayList<String>[];  //  这样是会编译报错的

ArrayList<String>[] list = new ArrayList[];  // 只能这样,创建一个非泛型数组对象,再赋值给list变量。

出现这个现象的原因就是:泛型会在编译期间进行类型擦,而数组刚好相反,在编译期间也会一直持有对应的类型,所以这两种一开始就是对立的。

 二、可以通过java.lang.reflect.Array的newInstance(Class<T> class,int length)方法创建泛型数组。

八、泛型和反射

常用:Class<T>和Constructor<T>

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

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

相关文章

POJ 2104 K-th Number 平方分割(分桶法)

一、题目大意 长度为n&#xff08;n<100000&#xff09;的数组&#xff0c;进行m次查询&#xff08;m<5000&#xff09;&#xff0c;每次查询时&#xff0c;输入为 i j k&#xff0c;返回为数组 [i,j] 的分片里第k大数字&#xff08;1<i<j<n,k<j-i1) 二、解…

基于Java的校园自助洗衣系统设计与实现(源码+lw+ppt+部署文档+视频讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

python机器学习之梯度下降法

系列文章目录 第一章 Python 机器学习入门之线性回归 第一章 Python 机器学习入门之梯度下降法 梯度下降法 系列文章目录前言一、梯度下降法1.梯度下降法简介2.基本原理 梯度下降函数效果展示 前言 上一篇文章里面说到了用梯度下降法来对最小化代价函数和模型参数进行求解&am…

计算机网络八股

1、请你说说TCP和UDP的区别 TCP提供面向连接的可靠传输&#xff0c;UDP提供面向无连接的不可靠传输。UDP在很多实时性要求高的场景有很好的表现&#xff0c;而TCP在要求数据准确、对速度没有硬件要求的场景有很好的表现。TCP和UDP都是传输层协议&#xff0c;都是为应用层程序服…

八、【快速选择工具组】

文章目录 对象选择工具快速选择工具魔棒工具 对象选择工具 当我们选择对象选择工具时&#xff0c;需要先注意上边有一个循环的圆&#xff0c;它会进行内容识别&#xff0c;当识别完成会停止旋转。这个时候我们按住n键&#xff0c;或者将鼠标放上对应的图形时会出现选中的颜色。…

多实例学习MIL(easy / hard)

多示例学习&#xff08;Multiple Instance Learning&#xff09; - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/377220948 多示例学习 和弱监督&#xff08;weakly supervised&#xff09;有一定的关系&#xff0c;弱监督weakly supervised有三个含义&#xff08;或者说三…

ethercat EOE arp

1 网口设置 电脑地址位169.254.254.3 2 从站地址 3 PING 正常 异常 4 抓包

【方法】如何取消ZIP压缩包的密码?

我们知道&#xff0c;在压缩ZIP文件的时候&#xff0c;可以设置“打开密码”来保护压缩包&#xff0c;那后续不需要保护了&#xff0c;不想每次打开压缩包都输一次密码&#xff0c;要如何取消密码呢&#xff1f; 比较常用的方法是先把ZIP压缩包解压后&#xff0c;再压缩成没有…

铝合金分类及相关总结

1 铝合金常识 铝合金是工业中应用最广泛的一类有色金属结构材料&#xff0c;在航空、航天、汽车、机械制造、船舶及化学工业中已大量应用。对于常用的铝合金&#xff0c;我们通常根据其铝及其他元素的含量&#xff0c;将其分为两大类&#xff0c;分别是纯铝和铝合金。对这两大类…

网络安全行业真的内卷了吗?网络安全就业就业必看

前言 有一个特别流行的词语叫做“内卷”&#xff1a; 城市内卷太严重了&#xff0c;年轻人不好找工作&#xff1b;教育内卷&#xff1b;考研内卷&#xff1b;当然还有计算机行业内卷…… 这里的内卷当然不是这个词原本的意思&#xff0c;而是“过剩”“饱和”的替代词。 按照…

JMeter接口自动化测试(数据驱动)

之前我们的用例数据都是配置在HTTP请求中&#xff0c;每次需要增加&#xff0c;修改用例都需要打开JMeter重新编辑&#xff0c;当用例越来越多的时候&#xff0c;用例维护起来就越来越麻烦&#xff0c;有没有好的方法来解决这种情况呢&#xff1f;我们可以将用例的数据存放在cs…

Effective Modern C++ 第七章 并发API 2

目录 条款37&#xff1a;使std::thread型别对象在所有路径皆不可联结 要点速记&#xff1a; 条款38&#xff1a;对变化多端的线程句柄析构函数行为保持关注 要点速记&#xff1a; 参考&#xff1a;EffectiveModernCppChinese/src/7.TheConcurrencyAPI/item37.md at master …

【java爬虫】使用vue+element-plus编写一个简单的管理页面

前言 前面我们已经将某宝联盟的数据获取下来了&#xff0c;并且编写了一个接口将数据返回&#xff0c;现在我们需要使用vueelement-plus编写一个简单的管理页面进行数据展示&#xff0c;由于第一次使用vue编写前端项目&#xff0c;所以只是编写了一个非常简单的页面。 项目结…

3263页学习资料,一本在手,python不愁!

Python3.11已经发布&#xff0c;新的版本速度提升2倍&#xff0c;以弥补与其他编程语言在速度上的缺陷。可以预见Python语言在未来的应用范围会越来越广。 python学习方向建议&#xff1a; 如果你是本科及以下学历&#xff0c;建议你学习以下两个方向 爬虫。简单的爬虫库&am…

异步电机直接转矩控制学习(两电平12扇区)

导读&#xff1a;传统的直接转矩控制方法6扇区电压矢量选择会导致磁链控制不对称、转矩脉动大等问题&#xff0c;本期介绍一种把扇区细分为12扇区的新型三相异步电机直接转矩控制方法&#xff0c;仿真结果证明磁链轨迹、转速及转矩脉动明显变小&#xff0c;异步电机三相定子电流…

Mac上protobuf环境构建-java

参考文献 getting-started 官网pb java介绍 maven protobuf插件 简单入门1 简单入门2 1. protoc编译器下载安装 https://github.com/protocolbuffers/protobuf/releases?page10 放入.zshrc中配置环境变量  ~/IdeaProjects/test2/ protoc --version libprotoc 3.12.1  …

Reset信号如何同步?

首先来复习一个更加基础的概念&#xff1a;同步reset和异步reset。 同步reset&#xff08;synchronous reset&#xff09;是说&#xff0c;当reset信号为active的时候&#xff0c;寄存器在下一个时钟沿到来后被复位&#xff0c;时钟沿到来之前寄存器还是保持其之前的值。 异步…

【计算机组成 课程笔记】7.1 存储层次结构概况

课程链接&#xff1a; 计算机组成_北京大学_中国大学MOOC(慕课) 7 - 1 - 701-存储层次结构概况&#xff08;15-14--&#xff09;_哔哩哔哩_bilibili 这是我们已经非常熟悉的冯诺依曼计算机结构&#xff0c; 其中和存储功能相关的部件有&#xff1a;存储器和外部记录介质肯定具有…

WEB各类常用测试工具

一、单元测试/测试运行器 1、Jest 知名的 Java 单元测试工具&#xff0c;由 Facebook 开源&#xff0c;开箱即用。它在最基础层面被设计用于快速、简单地编写地道的 Java 测试&#xff0c;能自动模拟 require() 返回的 CommonJS 模块&#xff0c;并提供了包括内置的测试环境 …

Stm32_标准库_6_八种输入出模式

上拉输入与下拉输入 上拉输入&#xff1a;电平默认为高电平&#xff0c;只有当外部输入为低电平时&#xff0c;此IO口电平才会被拉低&#xff0c;经过触发器&#xff0c;再到寄存器&#xff0c;最后传入CPU GPIO_Mode_IPU&#xff1b;下拉输入&#xff1a;电平默认为低电平&am…