java泛型学习

news2025/2/12 21:58:32

前言

没有泛型的时候,我们声明的 List 集合默认是可以存储任意类型元素的,乍一看你可能还会觉得挺好,这样功能强大,啥类型都可以存储......但是开发的时候由于不知道集合中元素的确切类型,遍历的时候我们拿到的 item 其实是 Object 类型,如果要使用就必须强转,强转就必须得判断当前元素的具体类型,否则直接使用强转很可能会发生类型转换异常。这样就会让开发很不方便,每次都要额外做判断工作。

 1.泛型概念

我的理解是:泛型就是把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型。

参数化类型,把类型当作是参数一样传递,Object<数据类型>这里面只能是引用类型不能是基本类型。

1.为什么泛型里面数据类型不能是基本类型呢?

因为虚拟机在编译时会把带泛型的转换成Object类型,而基本类型不属于Object类型,所以泛型里面数据类型不能是基本类型。

2.为什么要使用泛型?

 

 1.这个编译期安全是体现在,就是加入我们创建一个集合,用来存储int类型,但是不小心混进String类型,但是我们对这个集合的方法都是针对int类型,所以编译时会报错。

有泛型,我们就不会混进String数据。

2.创建集合,默认是Object类型的。我们不知道类型,加入存进去String,强转是int,tm不就抛异常了。

3.同一个类,能操作多种数据类型,怎么说呢?我们创建泛型类时,能自定义类型参数穿进去。

泛型只存在与编译期。

卧槽,再说一下,上面编译期的概念:编写代码 -- .class -- 代码运行

这其中,编写代码 -- .class,同属于编译期,因此我们编写代码,如果指定泛型类型,但是写出错误,编译器(编译器)给我们报错。

2.泛型的使用

可以是任意字母,只是比较个人比较习惯用 T 。

泛型有三种实用方式

泛型类:public class Test<T>}{} T表示未知类型

泛型接口:public interface Test<T>{} 和定义类一样

泛型方法:public <T> void Test(T name){}

// 泛型类中的<T>就没作用了
class Dog<T> implements Animal{
    public static void main(String[] args) {
        System.out.println(getStr("qhx"));
        System.out.println(getStr(1));
    }

    public static <T> T getStr(T str){ // 泛型方法中的<T> ,就是这个方法中的T属于他管。
        return str;
    }

}

泛型统配父的使用

1.无边界通配符

ArrayList<?> objects = new ArrayList<>(); // 表明我们list可以存储任何类型,但是实际上编译之后就是Object对象

2.上边界通配符 


public interface Animal {

}

class Dog implements Animal{
    public static void main(String[] args) {
        ArrayList<? extends Animal> objects = new ArrayList<>(); // 用extends关键字表明必须是Animal的子类或者实现类
    }
}

3.下边界通配符

public interface Animal {

}

class Dog implements Animal{
    public static void main(String[] args) {
        ArrayList<? super Dog> objects = new ArrayList<>(); // 用super关键字表明必须是Dog父类或者接口
    }
}

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

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

相关文章

路径规划算法:基于供需优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于供需优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于供需优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法供需…

图形编辑器开发:最基础但却复杂的选择工具

大家好&#xff0c;我是前端西瓜哥。 对于一个图形设计软件&#xff0c;它最基础的工具是什么&#xff1f;选择工具。 但这个选择工具&#xff0c;却是相当的复杂。这次我来和各位&#xff0c;细说细说选择工具的一些弯弯道道。 我正在开发的图形设计工具的&#xff1a; http…

复习并发编程的基础知识(二)

线程的状态6种状态及生命周期 1.new 2.Runnable&#xff08;Ready和Running&#xff09; 3.Blocked 4.Waiting 5.Timed_Waiting 6.Terminated 线程同步 同步&#xff1a;一些敏感的数据&#xff08;比如共享的需要修改的资源&#xff09;不允许被多个线程同时访问&#…

centos7 gitlab安装配置

gitlab概述 GitLab是一个基于Web的Git存储库管理和代码协作平台。它提供了一套完整的工具和功能&#xff0c;使团队能够更高效地进行代码版本控制、协作开发和持续集成/持续部署&#xff08;CI/CD&#xff09;。 以下是GitLab的主要功能和概述&#xff1a; 版本控制系统&…

使用布隆过滤器的flink十亿级数据实时过滤实践一

1项目背景 1.1 需求 实时推荐项目需求如下&#xff1a;根据用户实时行为&#xff08;如关注&#xff0c;播放&#xff0c;收藏)推荐该UP主(关注的up主&#xff0c;播放视频发布up主&#xff0c;收藏up主)或其相似UP主的作品&#xff0c;UP主及相似UP主下的作品是提前离线召回…

react---生命周期

目录 1.新旧生命周期对比 2.常用的3个钩子函数 3.生命周期&#xff08;旧&#xff09; 4.生命周期&#xff08;新&#xff09; React 中为我们提供了一些生命周期钩子函数&#xff0c;让我们能在 React 执行的重要阶段&#xff0c;在钩子函数中做一些事情。 1.新旧生命周期…

数据安全--17--数据安全管理之数据传输

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/131061729 一、数据传输概述 数据传输有两个主体&#xff0c;一个是数据发送方&#xff0c;另一个是数据接收方。数据在通过不可信或者较低安全性的网络进行传输时&#xff0c;容易发生数据被窃取、伪…

Mybatis源码学习之全局配置文件和映射文件解析

全局配置文件和映射文件解析 全局配置文件解析 public static void main(String[] args) throws IOException {// 读取配置文件InputStream is Resources.getResourceAsStream("org/apache/ibatis/builder/MapperConfig1.xml");// 创建SqlSessionFactory工厂SqlSes…

JDK11 官网下载(提供网盘下载资源)

目录 引言一、Oracle&#xff08;甲骨文&#xff09;二、JDK11下载1.JDK11下载入口2.JDK版本说明3.JDK11下载前说明4.JDK11下载 三、网盘下载1.资源提供说明2.资源列表清单&#xff08;持续更新中...&#xff09;3.获取方式 总结 引言 我们要学习 Java 语言去开发 Java 程序&a…

k8s 基本架构

k8s 中支持的 node 数 和 pod 数 k8s 也是逐步发展过来的&#xff0c;来看看以前和现在支持的 node 数 和 pod 数对比 node 即 节点 &#xff0c; 早期的 k8s 版本能够支持 100 台节点&#xff0c;现在 k8s 可以支持到 2000 台了 pod 数&#xff0c;早期的版本可以支持 1000 …

Android 自定义View 之 Dialog弹窗

Dialog弹窗 前言正文一、弹窗视图帮助类二、弹窗控制类三、监听接口四、样式五、简易弹窗六、常规使用七、简易使用八、源码 前言 在日常开发中用到弹窗是比较多的&#xff0c;常用于提示作用&#xff0c;比如错误操作提示&#xff0c;余额不足提示&#xff0c;退出登录提示等&…

linux 内核版本和发行版本

当要明确自己的Linux系统的版本号时&#xff0c;大多数情况是用命令确定Linux内核版本的。不过这个还是要与CentOS的版本号&#xff08;就是你使用的Linux系统的发行版本&#xff09;区分开来&#xff0c;这两个不是一个东西。 一、发行版本号 比如当时安装CentOS时&#x…

【Python】集合 set ① ( 集合定义 | 集合特点 | 代码示例 - 集合定义 )

文章目录 一、集合特点二、集合定义三、代码示例 - 集合定义 一、集合特点 在之前 的博客中 介绍了 列表 / 元组 / 字符串 数据容器 , 列表 支持 定义后 , 增加元素 / 修改元素 / 删除元素 , 并且 列表中可以存储 重复 / 有序 的元素 ;元组 定义后 不能 进行 增加元素 / 修改元…

(转载)有导师学习神经网络的回归拟合(matlab实现)

神经网络的学习规则又称神经网络的训练算法&#xff0c;用来计算更新神经网络的权值和阈值。学习规则有两大类别&#xff1a;有导师学习和无导师学习。在有导师学习中&#xff0c;需要为学习规则提供一系列正确的网络输入/输出对(即训练样本),当网络输入时&#xff0c;将网络输…

对于Promise的理解

1.什么是回调地狱 多层异步函数的嵌套叫做回调地狱 代码1&#xff1a; setTimeout(() > {console.log(吃饭);setTimeout(() > {console.log(睡觉);setTimeout(() > {console.log(打豆豆);}, 1000);}, 2000);}, 3000); 代码2: 通过id获取用户名,通过用户名获取邮箱…

如何自动识别快递单号和批量查询的方法

最近有很多朋友问我&#xff0c;有没有办法批量查询快递单号&#xff0c;查询该快递单号的所有物流发货信息&#xff1f;今天小编就来分享一个实用的查询技巧&#xff0c;教大家轻松查询多个快递单号&#xff0c;还可以一键保存查询数据&#xff0c;一起来看看吧。 首先今天我们…

PoseNet深度网络进行6D位姿估计的训练,python3实现

0.相关github网址 原版github代码-caffe实现tensorflow实现&#xff0c;相关版本较低&#xff0c;python2&#xff0c;本文根据此代码迁移到python3上面。pytorch实现&#xff0c;但将骨干模型从goglenet改成了resnet&#xff0c;实验效果得到提升&#xff0c;但没公布预训练权…

快递单号一键批量查询的具体操作方法和步骤

最近做电商的朋友对一个话题很感兴趣&#xff1a;如何批量查询快递单号&#xff1f;今天&#xff0c;小编给你安利一款软件&#xff1a;固乔快递查询助手&#xff0c;支持大量快递单号的批量查询。下面我们来看看批量查询的具体操作方法。 小伙伴们需要先在“固乔科技”的官网上…

session与cookie的来源与区别

目录 1.什么是HTTP&#xff1f; 2.cookie 3.session 4.cookie和session的区别 如果你对于session 和cookie 只有一点模糊理解&#xff0c;那么此文章能帮你更深入理解session和cookie &#xff0c;依旧和上篇文章一样&#xff0c;我们采用问题的方式来一步步探索&#xff0…

第七章 测试

文章目录 第七章 测试7.1 编码7.1.1 选择程序设计语言1. 计算机程序设计语言基本上可以分为汇编语言和高级语言2. 从应用特点看&#xff0c;高级语言可分为基础语言、结构化语言、专用语言 7.1.2 编码风格 7.2 软件测试基础7.2.1 软件测试的目标7.2.2 软件测试准则7.2.3 测试方…