JAVA--泛型

2023-10-26

一、概念

1、定义:

在定义类或接口通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。

2、引入:

从JDK1.5后,Java引入“参数化类型”概念,即在创建集合时指定可以再指定元素类型。

3、优点:

a、解决元素存储的安全性问题;

b、解决获取元素时,需要类型强制转化的问题;

二、自定义泛型

1、自定义泛型类、泛型接口

class DAO<T>{
    private Map<String,T> map=new HashMap<>();

    public void save(String id,T entity){
        map.put(id,entity);
    }

    public T get(String id){
        return map.get(id);
    }

    public void update(String id,T entity){
        if(map.containsKey(id)){
            map.put(id,entity);
        }
    }

    public List<T> list(){
        ArrayList<T> arrayList=new ArrayList<>();
        Collection<T> values = map.values();
        for(T t:values){
            arrayList.add(t);
        }
        return arrayList;
    }

注:

a、如interface List<T>,class FanTest<K,V>中T、K、V仅表示类型,其中使用任意字母都可以;

b、泛型实例化时,一定要在类名指定类型参数的值;(如:List<String> strList=new ArrayList<String>();  ps:其中从JDK1.7后new后面的泛型可省略)

c、接收类型可为多个,按需求设置;(如:class FanTest<K,V>中K、V均是)

d、泛型只能是类,不能用基本数据类型填充,但可以用包装类填充;

e、泛型不同的引用不能相互赋值;(编译时便报错)

f、如果编译时有ArrayList<String>和ArrayList<Integer>两种类型,但在运行时只会有一个ArrayList被加载到JVM中;

g、泛型如果不指定,将会被擦除,泛型对应的类型都会按Object处理;(但是不等价于Object)

l、最好一开始便决定是否使用泛型,要么不用要么一路用下去;

y、在类或接口声明泛型时,即在本类本接口中代表某种类型可以作为非静态属性的类型、非静态方法的参数类型,返回值类型;(静态方法不能使用类的泛型)

j、异常类不能使用泛型;

k、不能使用new E[ ];的形式,但是可以使用E[ ] elements = (E[ ])new Object[capacity]; 的形式;

2、自定义泛型方法

class DAO1{
    public <E>E get(E e){
        E o=e;
        return o ;
    }
}
public class GenericityTest2 {
    public static void main(String[] args) {
        DAO1 dao1 = new DAO1();
        System.out.println(dao1.get("sisi"));
    }
}

注:

a、方法也可以被泛型话,无论该类是否为泛型类,在泛型方法中可以定义泛型参数,此时传入的的参数类型就是参数类型;

b、泛型方法格式是:[访问权限] <泛型> 返回类型 方法名([泛型标识 参数名称]) 抛出的异常;

c、泛型方法是否为静态都可以正常通过编译运行;

三、泛型在继承上的体现

1、情况

a、如果BA的一个子类型(子类或者子接口),而G是具有泛型声明的类或接口,G<B>并不是G<A>的子类型,二者是平等关系;(如:String是Object的子类,但是List<String >并不是List<Object> 的子类。)

b、如果B是A的一个子类型(子类或者子接口),而G是具有泛型声明的类或者接口,这时B<G>就是A<G>的子类型;(如:LinkedHashSet是HashSet的子类,同时LinkedHashSet<String>也是HashSet<String>的子类。)

四、通配符

1、通配符的使用

a、使用类型通配符:?;

b、读取如List<?>对象的list元素时,永远是安全的;(因为无论list的真实类型是什么,它包含的都是Object类型)

c、写入list中的元素时除null都不行;(因为不确定写入的具体类型)

d、通配符仅在创建集合对象中使用,无法使用于泛型类泛型方法泛型对象的创建对象上;

2、有限制的通配符

a、<?>允许所有泛型的引用调用;

b、通配符指定上线,extends->使用时指定的类型必须是继承某个类,或者实现某个接口;(如:<? extends Number>,只允许Number及其子类引用调用。)

c、通配符指定下线,super->使用时指定的类型不能小于操作的类;(如:<? extends Number>,只允许Number及其父类引用调用。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA--泛型 的相关文章

随机推荐

  • 7月7日下午!GLM大模型技术前沿与应用探索

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 随着AIGC时代的到来 大型语言模型逐渐成为学术界和工业界的关注焦点 近期 各种大语言模型的涌现给自然语言处理领域的研究带来了诸多挑战 也逐渐对计算机视觉和计算机生物等领域产生了
  • 解析CAN的J1939协议PDU报文

    PF用来确定PDU格式 0 239表示PDU1格式 240 255表示格式2 PDU1格式报文表示向特定或全局地址发送 PDU2格式报文表示向全局地址发送 PS由PF决定其含义 DA表示报文要发送的目标地址 GE表示PS在PDU2中与PF的
  • 面试官问你为什么选择做客服_在线客户服务-您的选择

    面试官问你为什么选择做客服 On the Web news travels fast and a good customer testimonial is worth its weight in gold If a client feels
  • Java并发编程实战——彻底理解volatile

    文章目录 volatile作用 volatile实现原理 volatile的happens before关系 volatile的内存语义 volatile重排序与JMM内存屏障 volatile的使用误区 volatile的适用场景 vol
  • CI/CD一般流程图

    CI CD的流水线一般由按照一定的逻辑组织工具 下面是一个逻辑图串联工具形成的一个典型的CI CD流程 工具 Bitbucket 代码托管工具 Jenkins 编译工具 Docker 打包工具 Slack Email 通知工具 Artifa
  • .net mvc + vuejs 的项目结构

    net项目结构 程序目录结构 vue操作 前提 安装npm vue vue cli 1 进入控制台窗口 2 进入程序目录 3 运行 vue init webpack webjs 生成webjs及其子目录 4 cd webjs 5 npm i
  • 使用V C ++ 向.exe文件中写入资源

    使用V C 向 exe文件中写入资源 BOOL result HANDLE hFile CreateFile c test htm GENERIC READ FILE SHARE READ NULL OPEN EXISTING FILE A
  • Linux虚拟机增加内存后扩展swap空间( insufficient virtual memory,please increase swap space)

    虚拟内存 swap 的基本概念 虚拟内存 swap 就是将硬盘规划出一个区 间 让内存的数据可以经由硬盘来读取 swap工作原理是 当物理内存不够时 则某些在内存当中所占的程序会暂时被 移动到 swap 中 让物理内存可以被更需要的程序来优
  • 在Qt项目中添加pri文件

    在Qt项目框架里 很多人都喜欢用pri文件来管理项目 那么今天就来讲讲这个pri文件 目录 前言 创建pri文件的步骤 一 创建Qt项目 二 创建pri空文件 三 调试 前言 一般我们创建Qt项目工程的时候 都是直接把所有的项目 头文件和资
  • Qt 添加其他目录的资源文件

    添加App目录资源文件的方法 首先 添加 qrc文件 Add New xxx qrc 其次 在qrc文件上添加存在的目录 或者文件 添加其他目录资源文件的方法 如下图步骤
  • 网易一面,痛失30K:为啥用阻塞队列,list不行吗?

    程序员的成长之路 互联网 程序员 技术 资料共享 关注 阅读本文大概需要 5 5 分钟 来自 技术自由圈 本文目录 说在前面 1 什么是阻塞队列 2 主要并发队列关系图 3 阻塞队列和 List Set 的区别是什么 4 阻塞队列和普通Qu
  • Python之time模块

    目录 1 引言 2 时间戳与时间元组 2 1时间戳 2 2时间元组 3 时间格式化 3 1获取格式化的时间 3 2自定义格式化 4 附录 4 1重要函数 4 2参考 1 引言 Python 提供了一个 time模块来格式化时间 在pytho
  • Dockerfile镜像搭建实例+镜像构建LNMP

    Dockerfile镜像搭建实例 镜像构建LNMP 文章目录 Dockerfile镜像搭建实例 镜像构建LNMP 构建SSH镜像 构建Systemctl镜像 构建tomcat镜像 搭建LNMP 环境准备 拉取centos 7镜像 自定义网络
  • SpringBoot整合Mybatis实现商品评分

    前言 当今的电商平台越来越依赖于用户评分 以确定一个商品在市场中的竞争力和口碑 而SpringBoot整合Mybatis plus是非常适用于这一功能的框架 本文将介绍在SpringBoot应用中整合Mybatis plus框架 实现对商品
  • Android 沉浸式状态栏与隐藏导航栏

    一般我们在Android的APP开发中 APP的界面如下 可以看到 有状态栏 ActionBar ToolBar 导航栏等 一般来说 APP实现沉浸式有三种需求 沉浸式状态栏 隐藏导航栏 APP全屏 沉浸式状态栏是指状态栏与ActionBa
  • 长文详解HiveSQL执行计划

    本文目录 一 前言二 SQL的执行计划 2 1 explain 的用法 2 2 explain 的使用场景 案例一 join 语句会过滤 null 的值吗 案例二 group by 分组语句会进行排序吗 案例三 哪条sql执行效率高呢 案例
  • 人工测试之代码检查、走查与评审

    人工测试方法 代码检查 代码走查 桌面检查 同行评审 代码检查与代码走查的联系 1 要求人们组成一个小组来完阅读或直观检查特定的程序 找出错误 但不必改正错误 2 都是对过去桌面检查过程 在提交测试前 由程序员阅读自己程序的过程 的改进 3
  • Mac m1上使用docker搭建C++开发调试环境

    说明 因为mac上虚拟机都不太好用 有些还收费 故使用docker来搭建虚拟机 况且我的Mac是m1芯片 用的是arm架构 虚拟机更是少 搭建本机与虚拟机互通 mac上docker与linux不同 mac上实际上内部是建了个linux的虚拟
  • 在编写Java程序时,图片不显示的问题

    可能有几种原因导致图片无法正常显示 图片路径不正确 如果图片的路径错误或不存在 程序将无法找到图片并将其加载到内存中 在Java中 可以使用相对路径或绝对路径来指定图片路径 应根据实际情况进行调整 图片格式不支持 如果图片格式不受Java支
  • JAVA--泛型

    一 概念 1 定义 在定义类或接口通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型 2 引入 从JDK1 5后 Java引入 参数化类型 概念 即在创建集合时指定可以再指定元素类型 3 优点 a 解决元素存储的安全性问题