Java基础知识总结(61)

(1)泛型

    泛型是JDK 1.5中新增的特性,在集合框架中使用,某种程度上是为了让集合记住其保存的元素的类型。

    在泛型产生之前,集合中存入一个元素,集合并不知道存入元素的数据类型,集合会把所有对象全部当做Object类型处理。

    但是当作Object类型处理之后,会出现以下的问题:

   

        泛型是JDK 1.5中新增的特性,在集合框架中使用,某种程度上是为了让集合记住其保存的元素的类型。

        在泛型产生之前,集合中存入一个元素,集合并不知道存入元素的数据类型,集合会把所有对象全部当做Object类型处理。

       

    为解决以上的问题,JDK5以后,Java引入了泛型,即“参数化类型”。允许程序在创建集合时指定集合元素的类型(允许程序在创建对象或者调用方法时动态的指定),所谓泛型,就是允许在定义类、接口、方法时使用类型形参,这个类型形参将在声明变量、创建对象、调用方法时动态地指定(即传入实际的类型参数,也可称为类型实参)。

/**

 * 泛型练习

   */

   public class GnericityDemo {

   public static void main(String[] args) {

       //定义一个只能存放String类型的List集合

       List<String> list = new ArrayList<>();

       //添加元素到集合中

       list.add("白嘉轩");

       list.add("鹿子霖");

       list.add("朱先生");

       //编译出错 List泛型规定list中只能添加Stirng类型的元素 不能添加其他类型的元素

       //list.add(123)

   }

   }

/**

 * 菱形语法

   */

   public class GnericityDemo1 {

   public static void main(String[] args) {

       //在Java1.5中要求泛型在类名和构造器名后写在<>内

       List<String> list = new ArrayList<String>();

       //在Java1.7中则可以省略构造器名称后的<>内的泛型。

       List<String> list2 = new ArrayList<>();

   }

   }

   允许在定义类、接口、方法时使用类型形参,这个类型形参将在声明变量、创建对象、调用方法时动态地指定(即传入实际的类型参数,也可称为类型实参)。Java 5 改写了集合框架中的全部接口和类,为这些接口、类增加了泛型支持,从而可以在声明集合变量、创建集合对象时传入类型实参,

   泛型接口:

/**

 * 泛型接口

 * 允许在定义接口、类时声明类型形参、类型形参在整个接口、类中当成类型使用

 * @param <E>

   */

   public interface Ilist<E> extends Collection<E> {

   boolean add(E e);

   E get(int index);

   }

   泛型类:

/**

 * 泛型类

   */

   public class Student<T>{

   //定义泛型类型的成员变量 具体类型在创建对象时指定

   private T t;

   public Student(T t){

       this.t = t;

   }

   public T getT() {

       return t;

   }

   public void setT(T t) {

       this.t = t;

   }

   public T getInfo(){

       return this.t;

   }

   }

/**

 * 测试类

 * 定义了一个带泛型声明的Student<T>类,使用Student<T>类是就可以为T类型传入实际类型

   */

   public class GenericityDemo2 {

   public static void main(String[] args) {

       //创建对象时指定为String类型

       Student<String> s1 = new Student<>("白鹿原");

       System.out.println(s1.getInfo());

       //传给T形参的是Integer类型 所以构造器中只能是Integer类型

       Student<Integer> s2 = new Student<>(123);

       System.out.println(s2.getInfo());

   }

   }

   泛型通配符:

   Java中可以使用类型通配符,类型通配符是一个问号(?),将一个问号做为实际类型传给List集合,写作:List<?>,意思是元素类型未知的List。它的元素类型可以匹配任何类型。

/**

 * 新闻类 其泛型继承自Number 创建对象时,指定泛型必须是Number或者Number的子类

 * @param <T>

   */

   public class News <T extends Number>{

   }

public class GenericityDemo3 {

    public static void main(String[] args) {

        List<?> list = new ArrayList();

        //编译错误 add()方法有参数类型E作为集合的元素类型,所以传给add的参数必须是E类对象或者其子类的对象,但是在上例中不知道E是什么类型,所以无法将任何对象添加进集合

        //list.add(1);

        //如果想让上例中的代码正常工作,就需要学习通配符的上下限

        //设置了泛型的上限Number,也就是说,当创建Teacher对象指定泛型类型时,只能传入Number类型或者Number类型的子类

        News<Number> t1 = new News<>();

        //编译通过,Integer是Number的子类

        News<Integer> t3 =new News<>();

        //编译错误,Integer是Number的父类

        //News<Objects> t2 =new News<Objects>();

        //编译错误,因为String和Number不存在继承关系

        //News<String> t4 = new News<>();

    }

}

    泛型方法:

    前面介绍了在定义类、接口时可以使用类型形参,在该类的方法定义和成员变量定义、接口的方法定义中,这些类型形参可被当成普通类型来用。在另外一些情况下,定义类、接口时没有使用类型形参,但定义方法时可以定义类型形参。

   

    修饰符 <T> 返回值类型 方法名(形参列表){

        //方法体  

    }

public class GnericityDemo4{

    //定义泛型方法

    public <T> T test(T t){

        return t;

    }

    //注意:此方法只使用了泛型,不是泛型方法

    //    public void test(T t){

    //

    //    }

    public static void main(String[] args) {

        GnericityDemo4 gd = new GnericityDemo4();

        StringBuilder s =  gd.test(new StringBuilder("白鹿原"));

        System.out.println(s);

    }

}

    通配符下限:

public class GnericityDemo5 {

    public static void main(String[] args) {

        //通配符的下限

        TreeSet<String> set = new TreeSet<>(new Comparator<Object>() {

            @Override

            public int compare(Object o1, Object o2) {

                return 0;

            }

           

        });

    }

}

    泛型擦除:

public class GnericityDemo6 {

    public static void main(String[] args) {

        List<String> list1 = new ArrayList<>();

        list1.add("张三");

        //泛型擦除

        List list2 = list1;

    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【吊打面试官系列】Java高并发篇 -为什么使用 Executor 框架比使用应用创建和管理线程好?

大家好&#xff0c;我是锋哥。今天分享关于 【为什么使用 Executor 框架比使用应用创建和管理线程好&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 为什么使用 Executor 框架比使用应用创建和管理线程好&#xff1f; 为什么要使用 Executor 线程池框架 1、每…

MySQL 锁机制全面解析

目录 1. MySQL的锁类型1.1 全局锁1.2 表锁1.3 行锁1.4 共享锁&#xff08;读锁&#xff09;1.5 排它锁&#xff08;写锁&#xff09;1.6 死锁 2 乐观锁和悲观锁2.1 乐观锁2.2 悲观锁 3 意向锁4 间隙锁5 临键锁6. 事务隔离级别对锁的影响6.1 读未提交&#xff08;Read Uncommitt…

Day92:系统攻防-WindowsLinux远程探针本地自检任意执行权限提升入口点

目录 操作系统-远程漏扫-Nessus&Nexpose&Goby Nessus Nexpose 知识点&#xff1a; 1、远程漏扫-Nessus&Nexpose&Goby 2、本地漏扫-Wesng&Tiquan&Suggester 3、利用场景-远程利用&本地利用&利用条件 操作系统-远程漏扫-Nessus&Nexpose&a…

#LLM入门|RAG#3.5_基于文档的问答

大语言模型&#xff08;LLM&#xff09;构建的问答系统&#xff0c;通过整合用户文档&#xff0c;提供个性化和专业化回答。系统可检索内部文档或产品说明书&#xff0c;结合语言模型生成精准答案。 这种方法让语言模型利用外部文档专业信息&#xff0c;显著提升回答的质量和适…

RedHat9 KVM虚拟技术

以下有使用RedHat9单独的虚拟机也有使用RHEL9学员练习机和RHEL7学员练习机 KVM虚拟技术介绍 Linux的KVM(Kernel-based Virtual Machine)虚拟技术是一种基于Linux内核的虚拟化解决方案。它允许在单个物理服务器上创建和运行多个隔离的虚拟机,每个虚拟机都有自己的操作系统和…

常见嵌入式存储器学习

这里写目录标题 1. FPGA内部存储器1.1 RAM1.2 ROM 2. 外部存储器 1. FPGA内部存储器 1.1 RAM RAM即随机存取存储器&#xff08;Random Acccess Memory&#xff09;&#xff0c;数据不是线性依次存储&#xff0c;可以自由指定地址进行数据读写。RAM掉电数据丢失&#xff0c;速…

Docker 镜像仓库常见命令

Docker Registry (镜像仓库) 常用命令 docker login 功能&#xff1a;登录到一个 Docker 镜像仓库&#xff0c;如果没有指定镜像仓库的地址&#xff0c;默认就是官方的 Docker Hub 仓库。 语法&#xff1a; docker login [options] [server]选项&#xff1a; -u&#xff1a;登…

java生成数据库数据到excel当做下拉选择,copy就完事~

背景&#xff1a;由于需要下载模板&#xff0c;模板包含下拉选择框&#xff0c;但是下拉选择框不想手写&#xff0c;并且需要从数据库读取&#xff0c;由于直接设置excel会有单元格最大255个字符长度限制&#xff0c;所以用到以下部分代码。 思路&#xff1a;由于数据模板在sh…

MySQL 的事务概念

事务概念 MySQL事务是一个或者多个的数据库操作&#xff0c;要么全部执行成功&#xff0c;要么全部失败回滚。 事务是通过事务日志来实现的&#xff0c;事务日志包括&#xff1a;redo log和undo log。 事务状态 事务有以下五种状态&#xff1a; 活动的部分提交的失败的中止的…

字母加密(C语言)

一、题目&#xff1b; 为使电文保密&#xff0c;往往按一定规律将其转换成密码&#xff0c;收报人再按约定的规律将其译回原文。例如&#xff0c;可以按以下规律将电文变成密码&#xff1a;将字母A变成字母E&#xff0c;a变成e&#xff0c;即变成其后的第4个字母&#xff0c;W…

可以与 FastAPI 不分伯仲的 Python 著名的 Web 框架

正如你所理解的&#xff0c;任何领域都不可能停止进步&#xff0c;不断使用相同的工具意味着不思进取。这一点在信息技术领域&#xff0c;尤其是网络开发行业非常明显。 关于网络框架&#xff0c;不论是 Django 和 Flask 等传统框架还是 Python 的新型高级框架&#xff0c;一直…

开源项目|使用go语言搭建高效的环信 IM Rest接口(附源码)

项目背景 环信 Server SDK 是对环信 IM REST API 的封装&#xff0c; 可以节省服务器端开发者对接环信 API 的时间&#xff0c;只需要配置自己的 App Key 相关信息即可使用。 环信目前提供java和PHP版本的Server SDK&#xff0c;此项目使用go语言对环信 IM REST API 进行封装…

B端:再探列表页,这20个组件能让列表页功能完备,体验过关。

有很多小伙伴反馈设计列表页的时候&#xff0c;好看是好看了&#xff0c;但是用户体验不佳&#xff0c;处理数据十分不方便&#xff0c;这样好看也就失去了意义&#xff0c;贝格前端工场分析这个原因大概率是没有用好列表页的组件&#xff0c;丢三落四的情况比较多导致的&#…

RK3588 Android13 鼠标风格自定义动态切换

前言 电视产品,客户提供了三套鼠标图标过来,要求替换系统中原有丑陋风格且要支持动态切换, 并且在 TvSetting 中要有菜单,客户说啥就是啥呗,开整。 效果图 test framework 部分修改文件清单 png 为鼠标风格资源图片,这里就不提供了,可自由找一个替换一下就行 framew…

「Word 论文排版」插入分节符导致word转PDF后出现空白页

问题 word转PDF后出现空白页 解决 但是此方法会让页面页脚标记出错 TODO 如下图所示 在论文目录后有一个分节符&#xff0c;转成PDF之后就多了一个空白页 文件-打印-页面设置-选中封面那一页-版式-从偶数页开始 再导出空白页就没了

旅游陪同翻译难吗, 旅游翻译英译中哪家好?

近来&#xff0c;随着中国旅游业的蓬勃发展&#xff0c;旅游陪同翻译的需求也水涨船高&#xff0c;这些专业的翻译服务者为中外游客搭建起友谊的桥梁&#xff0c;引领他们共同探索中国这片古老而神秘的土地 。那么&#xff0c;旅游陪同翻译英译中难吗&#xff1f;我们如何在众多…

iTwin Capture Modeler-23中文版下载地址及安装教程

文章目录 一、iTwin Capture Modeler23中文版安装教程二、iTwin Capture Modeler23中文版下载地址一、iTwin Capture Modeler23中文版安装教程 1. 解压安装包。订阅专栏(可获取专栏内所有文章阅读权限与软件安装包)后,从文末获取安装包解压,如下所示: 2. 右击安装包,选择以…

MQ技术选型

消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合、异步消息、流量削锋等问题。它可以实现高性能、高可用、可伸缩和最终一致性架构&#xff0c;是大型分布式系统不可缺少的中间件。 RabbitMQ 特点&#xff1a; RabbitMQ 相当轻量级的消息队列&#xff…

探索 2024 年促进业务发展的最佳定制 GPT

打造个性化客户体验: GPT模型在电子商务中的应用 介绍 在商业领域&#xff0c;人工智能&#xff08;AI&#xff09;的出现开创了创新和效率的新时代。 最具影响力的人工智能技术之一是自定义 GPT 模型。 本文探讨了自定义 GPT 模型如何显着促进各种业务运营。 自定义 GPT 模型的…

零售数据分析之补货表怎么做?

做零售数据分析&#xff0c;不仅要关注销售&#xff0c;还需要注意补货分析。通过补货分析了解不同商品要在什么时候进行补货&#xff0c;提前做好库存准备&#xff0c;以免出现补货不及时的失误。那么&#xff0c;零售数据分析中的补货表该怎么做&#xff1f;需要计算分析哪些…