java--泛型

                                           欢迎来到我的博客~~欢迎大家对我的博客进行指导~

点击进入我的博客主页

目录

  • 一、什么是泛型
  • 二、包装类
    • 2.1基本数据类型和对应的包装类
    • 2.2装箱和拆箱
    • 2.3 自动装箱和自动拆箱
  • 三、引出泛型
  • 四、泛型类的使用
    • 4.1 语法
    • 4.2示例
  • 五、泛型如何编译的
  • 六、泛型的上界
    • 6.1语法
    • 6.2 示例
  • 七、求一个数组的当中数的最大值
    • 7.1泛型类求
    • 7.2 泛型方法求
    • 7.3静态的泛型方法

一、什么是泛型

一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。----- 来源《Java编程思想》对泛型的介绍。
泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化。

二、包装类

在讲泛型之前,先了解一下什么是包装类。

在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了
一个包装类型。

2.1基本数据类型和对应的包装类


2.2装箱和拆箱

public class Test {public static void main(String[] args) {int a=10;//装箱操作,新建一个Integer类型对象,将a的值放入对象的某个属性当中Integer b=Integer.valueOf(a);Integer c=new Integer(a);//拆箱操作,将Integer对象中的值取出,放到一个基本数据类型中int d=b.intValue();int e=b.intValue();}
}

2.3 自动装箱和自动拆箱

可以看到在使用过程中,装箱和拆箱带来不少的代码量,所以为了减少开发者的负担,java 提供了自动机制.
在这里插入图片描述

三、引出泛型

实现一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个下标的值?
思路:

  1. 我们以前学过的数组,只能存放指定类型的元素,例如:int[] array = new int[10]; String[] strs = new String[10];
  2. 所有类的父类,默认为Object类。数组是否可以创建为Object?
class Marray{Object[] obj=new Object[10];public void setobj(int pos,Object arrays){this.obj[pos]=arrays;}public Object getobj(int pos){return this.obj[pos];}
}
public class Test {public static void main(String[] args) {Marray marray=new Marray();Object array=new Object();marray.setobj(0,1);//整型marray.setobj(1,"hello");//字符串String str=(String) marray.getobj(1);}
}

问题:以上代码实现后 发现

  1. 任何类型数据都可以存放
  2. 1号下标本身就是字符串,但是却编译报错。必须进行强制类型转换
    虽然在这种情况下,当前数组任何数据都可以存放,但是,更多情况下,我们还是希望他只能够持有一种数据类型。而不是同时持有这么多类型。所以,泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译器去做检查。此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型。

语法:

class 泛型类名称<类型形参列表> {
// 这里可以使用类型参数
}
class ClassName<T1, T2, ..., Tn> {
}

对上面代码使用泛型进行改写。

class Marray<E>{public Object[] obj=new Object[10];public void setobj(int pos,Object arrays){this.obj[pos]=arrays;}public E getobj(int pos){return (E)this.obj[pos];}
}
public class Test {public static void main(String[] args) {Marray<Integer> marray=new Marray<>();Object array=new Object();marray.setobj(0,1);//整型marray.setobj(1,"hello");//字符串//String str=marray.getobj(1);int INT=marray.getobj(0);System.out.println(INT);}
}

类名后的 代表占位符,表示当前类是一个泛型类
了解: 【规范】类型形参一般使用一个大写字母表示,常用的名称有:
E 表示 Element
K 表示 Key
V 表示 Value
N 表示 Number
T 表示 Type


四、泛型类的使用

4.1 语法

泛型类<类型实参> 变量名; // 定义一个泛型类引用
new 泛型类<类型实参>(构造方法实参); // 实例化一个泛型类对象

4.2示例

MyArray<Integer> list = new MyArray<Integer>();

注意:泛型只能接受类,所有的基本数据类型必须使用包装类!

五、泛型如何编译的

那么,泛型到底是怎么编译的?这个问题,也是曾经的一个面试问题。泛型本质是一个非常难的语法,要理解好他还是需要一定的时间打磨。
在编译的过程当中,将所有的T替换为Object这种机制,我们称为:擦除机制。
Java的泛型机制是在编译级别实现的。编译器生成的字节码在运行期间并不包含泛型的类型信息。
有关泛型擦除机制的文章截介绍:点这里


六、泛型的上界

6.1语法

class 泛型类名称<类型形参 extends 类型边界> {
...
}

6.2 示例

public class MyArray<E extends Number> {
...
}

只接受 Number 的子类型作为 E 的类型实参:

class Mydai<E extends Number>{public Object[] obj=new Object[10];public void setobj(int pos,Object array){this.obj[pos]=array;}public E getobj(int pos){return (E)this.obj[pos];}
}
public class Test {public static void main(String[] args) {Mydai<Integer> mydai1=new Mydai<>();mydai1.setobj(0,1);mydai1.getobj(0);System.out.println("=======");Mydai<String> mydai=new<> Mydai();//编译报错,不是NuMber的子类型}
}

没有指定类型边界 E,可以视为 E extends Object。


七、求一个数组的当中数的最大值

7.1泛型类求

class Mydai<E extends Comparable<E>>{public Object[] obj=new Object[10];public E compara(E[] array){E max=array[0];for (int i = 1; i < array.length; i++) {if(max.compareTo(array[i])<0){max=array[i];}}return max;}
}
public class Test {public static void main(String[] args) {Integer[] arrays={1,56,23,5,10,81};Mydai<Integer> mydai=new Mydai<>();System.out.println(mydai.compara(arrays));}
}

7.2 泛型方法求

class findmax{public <E extends Comparable<E>>E compara(E[] array){E max=array[0];for (int i = 1; i < array.length; i++) {if(max.compareTo(array[i])<0){max=array[i];}}return max;}
}
public class Test {public static void main(String[] args) {Integer[] arrays={1,56,23,5,10,81};findmax findmax=new findmax();//int max=findmax.<Integer>compara(arrays);int max=findmax.compara(arrays);System.out.println(max);}
}

7.3静态的泛型方法

class findmax{public static  <E extends Comparable<E>>E compara(E[] array){//静态E max=array[0];for (int i = 1; i < array.length; i++) {if(max.compareTo(array[i])<0){max=array[i];}}return max;}
}
public class Test {public static void main(String[] args) {Integer[] arrays={1,56,23,5,10,81};//int max=findmax.<Integer>compara(arrays);int max=findmax.compara(arrays);System.out.println(max);}
}

在这里插入图片描述
欧耶!!我学会啦!!!

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

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

相关文章

【CentOS】中的Firewalld:全面介绍与实战应用(下)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、iptables 时代 2、firewalld 时代 二、服务管…

【新人系列】Python 入门(九):数据结构 - 中

✍ 个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4dd; 专栏地址&#xff1a;https://blog.csdn.net/newin2020/category_12801353.html &#x1f4e3; 专栏定位&#xff1a;为 0 基础刚入门 Python 的小伙伴提供详细的讲解&#xff0c;也欢迎大佬们…

如何用【钉钉文档】发公告

功能亮点 ✔️借助钉钉文档强大的编辑能力&#xff0c;可以让编写出的公告更加精美。 ✔️将钉钉文档一键导入公告&#xff0c;可以完整保留已经编辑好的格式&#xff0c;无需再手动调整。 ✔️使用钉钉文档&#xff0c;可以将所有公告内容有序沉淀和保存。 &#x1f4a1; 使…

工位管理自动化:Spring Boot企业级工具

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理企业级工位管理系统的相关信息成为必然。开…

相亲小程序(源码+文档+部署+讲解)

最近我在挖掘一些优秀的开源项目时&#xff0c;无意间发现了一个相当给力的系统——相亲小程序管理系统。这个系统不仅功能实用&#xff0c;而且代码结构清晰&#xff0c;易于二次开发。作为一名技术爱好者&#xff0c;我觉得有必要把这个好东西推荐给我的读者们。接下来&#…

Filter and Search 筛选和搜索

Goto Data Grid 数据网格 Filter and Search 筛选和搜索 Filter Drop-down Menus (Excel-style) 筛选器下拉菜单&#xff08;Excel 样式&#xff09; 要调用列的筛选器下拉菜单&#xff0c;请单击列标题中的筛选器图标。在 “Values” 选项卡中&#xff0c;用户可以从 Data …

java项目报错:错误提示Could not initialize class com.jacob.com.ComThread

java项目报错&#xff1a;错误提示Could not initialize class com.jacob.com.ComThread 下载地址&#xff1a; 通过网盘分享的文件&#xff1a;jacob-1.19 链接: https://pan.baidu.com/s/1ouudh7A2-Y2kqPh_q-WYiA?pwdqhr3 提取码: qhr3 –来自百度网盘超级会员v7的分享 安…

Linux服务管理-多路径multipath

多路径Multipath 概述 多路径&#xff08;Multipath&#xff09;技术&#xff0c;特别是在存储系统中&#xff0c;是一种提高可靠性和性能的重要手段。多路径技术允许服务器通过多条物理路径连接到存储设备。这些路径可以是包含独立电缆、交换机和控制器的物理SAN连接。 多路…

省级绿色金融指数数据(1990-2021年)

绿色信贷是指银行在信贷业务中采纳环境标准&#xff0c;对污染企业的资金进行限制&#xff0c;同时对环保企业给予扶持。这种模式旨在促使贷款企业承担环境责任&#xff0c;实现节能减排&#xff0c;优化产业结构&#xff0c;以及改变经济增长方式。 1990-2021年省级绿色金融指…

【go从零单排】通道select、通道timeout、Non-Blocking Channel Operations非阻塞通道操作

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 select 语句是 Go 的一种控制结构&#xff0c;用于等待多个通道操作。它类似于 s…

Unity资源打包Addressable AA包

从零到一 很多资料都是通过一步步设置讲解的&#xff0c;有时很想先快速实现&#xff0c;再了解细节。 下面就是远程加载Cube.prefab然后实例化简单的代码。 代码中可以不需要远程的网址&#xff0c;不需要资源下载的位置&#xff0c;不需要判断是否已经下载到本地。 那是如…

Microsoft Visual C++ 安装失败 0x80070666

“0x80070666”错误通常在尝试安装 Microsoft Visual C、Lumberyard 或类似的分发包时发生。该错误信息通常在安装过程的开始阶段就被报告。此问题并非特定于某一Windows版本&#xff0c;已经确认在Windows 7、Windows 8.1和Windows 10中均会发生。 0x80070666 错误在安装 Micr…

netcat工具安装和使用

netcat是一个功能强大的网络实用工具&#xff0c;可以从命令⾏跨⽹络读取和写⼊数据。 netcat是为Nmap项⽬编写的&#xff0c;是⽬前分散的Netcat版本系列的经典。 它旨在成为可靠的后端⼯具&#xff0c;可⽴即为其他应⽤程序和⽤户提供⽹络连接。 一&#xff0c;下载安装 1&a…

带隙基准学习笔记一

1.带隙基准原理&#xff1a; 带隙基准电压源采用BJT&#xff0c;利用其基极-发射极电压的负温度系数和两个不同的BJT基极-发射极电压之差的正温度系数用于获得温度系数为零的基准电压源&#xff0c;因为最终计算的输出电压接近硅晶体的一个带隙电压&#xff0c;所以被称为带隙…

使用 Node.js 了解 MVC 模式

模型-视图-控制器 &#xff08;MVC&#xff09; 模式是 Web 开发中最流行的架构模式之一。通过将应用程序划分为三个相互关联的组件&#xff08;模型、视图和控制器&#xff09;&#xff0c;MVC 促进了有组织、可维护和可扩展的代码。Node.js 具有异步处理和庞大的生态系统&…

35.3K+ Star!PhotoPrism:一款基于AI的开源照片管理工具

PhotoPrism 简介 PhotoPrism[1] 是一个为去中心化网络设计的AI照片应用,它利用最新技术自动标记和查找图片,实现自动图像分类与本地化部署,你可以在家中、私有服务器或云端运行它。 项目特点 主要特点 浏览所有照片和视频,无需担心RAW转换、重复项或视频格式。 使用强大的…

VMware虚拟机安装Win7专业版保姆级教程(附镜像包)

一、Win7镜像下载: 链接&#xff1a;https://pan.baidu.com/s/1tvN9hXCVngUzpIC6b2OGrA 提取码&#xff1a;a66H 此镜像为Win7专业版(收藏级镜像 已自用几年)&#xff0c;官方纯净系统没有附带任何其他第三方软件。 二、配置虚拟机 1.创建新的虚拟机。 这里我们以最新的VMware…

中国前首富胡志标受邀出席创客匠人“全球创始人IP领袖高峰论坛”

创客匠人正式官宣&#xff01;原爱多VCD创始人、中国前首富胡志标受邀出席创客匠人5000人“全球创始人IP领袖高峰论坛”&#xff0c;将与我们携手共赴这场商业巅峰盛宴。 由创客匠人打造的“全球创始人IP领袖高峰论坛”将在2024年12月26日-28日在厦门市国际博览会议中心如期举…

TCP可靠连接的建立和释放,TCP报文段的格式,UDP简单介绍

TCP连接的建立&#xff08;三次握手&#xff09; 建立连接使用的三报文 SYN 报文仅用于 TCP 三次握手中的第一个和第二个报文&#xff08;SYN 和 SYN-ACK&#xff09;&#xff0c;用于初始化连接的序列号。数据传输阶段不再使用 SYN 标志。 SYN 报文通常只携带连接请求信息&a…

flink 同步oracle11g数据表到pg库

1. 关闭防火墙和selinux systemctl stop firewalld systemctl disable firewalld systemctl status firewalldvi /etc/selinux/config 修改为disabled2.安装java8 yum list java-1.8* yum install java-1.8.0-openjdk* -yjava -version3.下载和部署postgresql 看需求安装pg库…