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--泛型 的相关文章

  • 在 Java 中捕获(捕获)窗口中的鼠标光标

    我正在寻找一种方法 在鼠标进入窗口后捕获或捕获该窗口中的鼠标 就像鼠标被捕获在虚拟机窗口中一样 直到用户按 CTRL ALT DEL 或以其他方式释放鼠标 我如何在 Java 中实现这一点 全屏显示不是一个选择 EDIT 这里有一些 SSC
  • 不支持的字段:将瞬间格式化为日期 ISO 时的年份[重复]

    这个问题在这里已经有答案了 我正在尝试将 Instant 格式化为 ldap 日期 ISO8601 但在 f format Instant now 处失败 String input 20161012235959 0Z DateTimeFor
  • Selenium:将 Internet Explorer 中的文件下载到指定文件夹,无需直接链接,无需 Windows 窗体,无需 AutoIt 或 Robot

    我经常遇到一个问题 如何在 IE 中下载文件 与 Firefox 的 Chrome 不同 您不能只指定所需的文件夹 所有文件都会下载到该文件夹 您还需要与本机 Windows 表单等进行交互 有多种选项 例如使用 AutoIt 使用键盘命令
  • java 中的梵文 i18n

    我正在尝试使用来自互联网的示例 ttf 文件在 java 中使用 i18n 进行梵文 印地文 我可以加载资源包条目 还可以加载 ttf 并设置字体 但它不会根据需要呈现 jlabel 它显示块代替字符 如果我在 Eclipse 中调试 我可
  • 垂直 ViewPager 中的动画

    我需要垂直制作这个动画ViewPager https www youtube com watch v wuE 4jjnp3g https www youtube com watch v wuE 4jjnp3g 这是我到目前为止所尝试的 vi
  • JAXB 继承冲突 - 重新注释子类

    目前我的项目中有这样的环境 public abstract class Foo private List
  • 使用 Jena 查询维基数据

    目前 Wikidata 有一个 SPARQL 端点 https query wikidata org https query wikidata org 我想使用 Jena 3 0 1 查询此网站 我使用以下代码 但收到错误消息 端点返回的
  • 在拇指上方显示修改后的 JSlider 值

    有没有一种简单的方法可以在使用某些 外观和感觉 的同时更改 JSlider 上方标签中显示的值 为了清楚起见 我正在谈论这个值 具体来说 我想显示除以 1000 的值而不是值本身 我知道如果我显示它们 我可以为刻度设置标签 但用户将不得不猜
  • for循环中更新JLabel的问题

    我的程序的想法是从之前在其他 JFrame 中保存的列表中选择一个名称 我想在标签中一个接一个地打印所有名称 它们之间有很小的延迟 然后停在其中一个名称上 问题是lbl setText String 如果有多个则不起作用setText co
  • 膨胀类 android.support.design.widget.NavigationView 时出错

    我按照 NavigationView 的教程进行操作 但无法解决此错误消息 Error inflating class android support design widget NavigationView 教程链接 https www
  • 使用 Guava Ordering 对对象列表进行多条件排序

    我有一个类无法实现可比较 但需要根据 2 个字段进行排序 我怎样才能用番石榴实现这一目标 假设班级是 class X String stringValue java util Date dateValue 我有一个清单 List
  • 获取 Future 对象的进度的能力

    参考 java util concurrent 包和 Future 接口 我注意到 除非我弄错了 只有 SwingWorker 实现类才能启动冗长的任务并能够查询进度 这就引出了以下问题 有没有办法在非 GUI 非 Swing 应用程序 映
  • 无法连接到docker中的elasticsearch容器

    我正在尝试使用 docker 的官方 elasticsearch 镜像 我遵循了本指南 https www elastic co guide en elasticsearch reference current docker html但是当
  • java.lang.UnsatisfiedLinkError - android studio gradle 中的 NDK?

    文件夹结构 app main java jni Android mk Application mk hello jni c res 在构建 gradle apply plugin com android application androi
  • 如何使用eclipse调试JSP tomcat服务?

    我想使用 Eclipse IDE 调试器来调试单独运行的 JSP Struts Tomcat Hibernate 应用程序堆栈 如何设置 java JVM 和 eclipse 以便设置断点 监视变量值并查看当前正在执行的代码 我刚刚用谷歌搜
  • 使用 Java 8 Spring 4 + MyBatis 集成问题

    使用 Java 8 1 8 0 60 Spring 4 2 1 和 MyBatis 3 3 0 时遇到以下异常 Sep 29 2015 11 02 58 AM org springframework context annotation A
  • Firebase:用户注册后如何进行电话号码验证?

    所以我知道我可以使用电子邮件验证或电话号码验证 但我想做的是在用户注册或登录后进行电话号码验证 如何连接这两种身份验证方法 最后 Firebase中是否有一个函数可以检查用户是否通过电话号码验证 谢谢 即使用户已通过身份验证 您仍然可以使用
  • Java 中序列化的目的是什么?

    我读过很多关于序列化的文章 以及它如何如此美好和伟大 但没有一个论点足够令人信服 我想知道是否有人能真正告诉我通过序列化一个类我们真正可以实现什么 让我们先定义序列化 然后我们才能讨论它为什么如此有用 序列化只是将现有对象转换为字节数组 该
  • 如何在J2ME中获取数字的幂[重复]

    这个问题在这里已经有答案了 可能的重复 J2ME power double double 数学函数实现 https stackoverflow com questions 2076913 j2me powerdouble double ma
  • Unicode(希腊语)字符存储在数据库中,例如“??????”

    数据库中的希腊字符就像问号 我找不到解决办法 我使用 Java Swing 开发了一个应用程序 但是当我在 MySQL 中插入希腊字母时 就像问号一样 我将数据库排序规则更改为 utf8 并将列也更改为 utf8 我的项目编码设置为UTF

随机推荐

  • 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 解决元素存储的安全性问题