谈谈包装类与泛型

news2024/11/14 12:09:42

目录

包装类

基本数据类型与对应的包装类

装箱和拆箱

装箱

拆箱

泛型

什么是泛型

泛型的语法与使用

泛型的编译

擦除机制

泛型的上界

泛型方法


提到泛型的话,我们就先提一下包装类吧!

包装类

在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。(注意int和char的包装类不是只大写第一个字母)

基本数据类型与对应的包装类

基本数据类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

装箱和拆箱

装箱

装箱:把一个基本数据类型 转化为 包装类型的过程

装箱又分为自动装箱和显示装箱,但是都调用了valueof()方法。下面代码可以体现

eg:

    public static void main(String[] args) {
        int a = 10;

        Integer b = a; //自动装箱

        Integer c = Integer.valueOf(a); //显示装箱

    }

拆箱

拆箱:把一个包装类型 转化为 基本数据类型的过程

拆箱也分为自动装箱和显示装箱。下面代码可以体现

eg:

    public static void main(String[] args) {

        Integer a = new Integer(10);

        int b = a; //自动拆箱

        int c = a.intValue(); //显示拆箱

        double d = a.doubleValue();
    }


泛型

什么是泛型

就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化

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

class MyArray {
    //可以存放任何类型的话 定义一个Object数组
    public Object[] array = new Object[10];

    //pos放入的位置 val存放的数据
    public void set(int pos, Object val) {
        array[pos] = val;
    }

    //获取数据
    public Object get(int pos) {
        return array[pos];
    }

}

但是这样写的话需要强转类型

 那么怎么解决呢?

这就不得不提出泛型了

泛型的语法与使用

class 泛型类名称<类型形参列表> {
// 这里可以使用类型参数
}

 作用:

1. 泛型是将数据类型参数化,进行传递

2. 使用 <T> 表示当前类是一个泛型类。

3. 泛型目前为止的优点:数据类型参数化,编译时自动进行类型检查和转换

这样(代码体现)就能解决上面的问题了(可以不用强制类型转换)

class MyArray<T> {
    //可以存放任何类型的话 定义一个Object数组
    public Object[] array = new Object[10];

    //pos放入的位置 val存放的数据
    public void set(int pos, T val) {
        array[pos] = val;
    }

    //获取数据
    public T get(int pos) {
        return (T)array[pos];
    }

}


//测试类中的main方法
public static void main(String[] args) {
    //<>里面只能放包装类型
    MyArray<String> myArray1 = new MyArray<>();
        
    MyArray<Integer> myArray2 = new MyArray<>();
        
}

注意:不能new一个泛型类的数组 但是可以下面这样写(不推荐)

class MyArray<T> {

    public T[] array2 = new T[10]; //不能直接new(下面会解释)

    public T[] array3 = (T[]) new Object[10];//不建议
    
}

泛型的编译

擦除机制

通过命令:javap -c 查看字节码文件,所有的T都是Object。在编译的过程当中,将所有的T替换为Object这种机制,我们称为:擦除机制。Java的泛型机制是在编译级别实现的。编译器生成的字节码在运行期间并不包含泛型的类型信息


提出问题:
1.那为什么,T[] ts = new T[5]; 是不对的,编译的时候,替换为Object,不是相当于:Object[] ts = new Object[5]吗?

这是因为在Java中,泛型类型擦除机制会将T转换为Object,并且不支持创建泛型数组。

public class GenericArray<T> {
    private T[] array;

    public GenericArray(int size) {
        this.array = new T[size]; // 编译错误
    }
}

上述代码中,在使用new关键字创建GenericArray实例时,我们尝试创建一个大小为size的泛型数组。但是,由于类型擦除机制,编译器无法了解T的确切类型,因此无法创建泛型数组。

泛型的上界

语法:

 

 实例:

 这里的传入的类型形参(E)必须是边界(Number)的子类

求一个数组中的最大值想必大家都不陌生吧,那么大家看看下面的代码,为什么报错呢?

 这里是因为呢,在编译的时候T会被替换成Object,但是在Object类中没有没有实现比较的接口,因为它是引用类型,必须 . 一个比较的方法,也得让T实现比较的接口。代码如下:

//这里extends是扩展的意思 不是继承的意思
class Alg<T extends Comparable<T>> {

    public T findMax(T[] array) {
        T max = array[0];
        for (int i = 1; i < array.length; i++) {
            if(array[i].compareTo(max) > 0) {
                max = array[i];
            }
        }
        return max;
    }

}

泛型方法

语法:

示例:

    //泛型方法 返回值为T类型
    public static <T> T swap() {
        
    }

 

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

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

相关文章

STC8单片机+基于DMP库解析MPU6050数据+匿名上位机图形化显示

STC8单片机+基于DMP库解析MPU6050数据+匿名上位机图形化显示 📌相关篇《STC8单片机+基于DMP库解析MPU6050数据+vofa+图形化显示》✨该工程代码匹配的是匿名四轴上位机软件的2.6版本通讯协议,所以支持使用2.6版本的,最新的版本不支持。🌿验证对象:STC8H8K64U🌿时钟频率…

产品需求文档|协调、协作和沟通新产品开发的专业指南

「产品需求文档」是一个强大的产品管理工具&#xff0c;被众多敏捷团队推荐&#xff0c;并被一些行业中的大公司使用。 它有助于使团队保持一致&#xff0c;促进长期合作&#xff0c;并向团队成员传达优先必做事项&#xff0c;以完成工作。 如果你还没有开始制作&#xff0c;…

一个有趣的vc1编码器

这里分享一个vc1编码器&#xff0c;下载地址&#xff1a; https://download.csdn.net/download/weixin_43360707/87791898 文件包在附件&#xff0c;打开文件夹&#xff0c;可以看到下面三个文件夹&#xff1a; 因为我们的系统试Linux&#xff0c;所以我们选择Linux(x64). 继…

kubeadm方式搭建的k8s集群升级——2023.05

文章目录 一、概述二、集群概况三、升级集群2.1 确定升级版本2.2 升级Master2.3 升级 Worker 四、验证集群 一、概述 搭建k8s集群的方式有很多种&#xff0c;比如二进制&#xff0c;kubeadm&#xff0c;RKE&#xff08;Rancher&#xff09;等&#xff0c;k8s集群升级方式也各有…

利用android studio 生成 JNI需要的动态库so文件 图文详解

一、环境搭建 1.1 Android studio2021.2.1安装 到官网下载&#xff0c;此处不再陈述 1.2 JNI安装 JNI 是JDK里的内容&#xff0c;电脑上正确安装并配置JDK即可。 1.3 NDK安装 直接在Android studio下载&#xff08;File---->Settings&#xff09; 1.4 编译工具 工具一…

72.建立一个表格组件

本节课我们将实现如下的表格&#xff1a; ● 首先&#xff0c;我们直接用表格元素将这些数据展现出来 <table><tr><td>Chair</td><td>The Laid Back</td><td>The Worker Bee</td><td>The Chair 4/2</td></tr…

数据结构与算法——算法与算法分析

算法与算法分析 初识算法算法的定义算法的描述算法与程序算法的特性算法设计的要求 算法时间效率的度量事前估计法算法时间复杂度的渐进表示法算法时间复杂度案例分析最好、最坏和平均时间复杂度算法的空间复杂度 初识算法 算法的定义 算法&#xff0c;即是对特定问题求解方法…

Winform实现以管理员模式启动并实现修改系统时间

场景 SpringBoot/Java中定时请求并根据服务端响应头的date实现本地Windows修改时间/时间同步(管理员权限问题-bat管理员启动cmd并运行jar)&#xff1a; SpringBoot/Java中定时请求并根据服务端响应头的date实现本地Windows修改时间/时间同步(管理员权限问题-bat管理员启动cmd…

在家吃灰老主机怎么自建黑群晖NAS当影音服务器

准备:u盘一个,老主机一个,要显示器键盘,烧u盘软件win32-disk(网上找)、balena(balenaEtcher - Flash OS images to SD cards & USB drives)的 1,巴西大佬的引导文件 进来这里 GitHub - fbelavenuto/arpl: Automated Redpill Loader 点右边的release文件下载 下载…

golang 函数调用栈笔记

一个被函数在栈上的情况&#xff1a;&#xff08;栈从高地址向低地址延伸&#xff09; 返回地址&#xff08;函数执行结束后&#xff0c;会跳转到这个地址执行&#xff09; BP&#xff08;函数的栈基&#xff09;局部变量返回值&#xff08;指的是函数返回值&#xff0c;eg&am…

Facebook广告投放过程中,如何提高有效曝光?

在数字营销中&#xff0c;广告曝光是至关重要的一环&#xff0c;Facebook广告投放也不例外。 有效曝光能够提高广告的点击率和转化率&#xff0c;从而帮助企业实现更好的广告效果。那么在Facebook广告投放过程中&#xff0c;如何提高有效曝光呢&#xff1f;下面将为大家分享几…

【Mybatis】SpringBoot整合Mybatis

唠嗑部分 之前我们说了Mybatis的一些文章&#xff0c;相关文章&#xff1a; 【Mybatis】简单入门及工具类封装-一 【Mybatis】如何实现ORM映射-二 【Mybatis】Mybatis的动态SQL、缓存机制-三 【Mybatis】Mybatis处理一对多、多对多关系映射-四 这篇文章我们来说说SpringBoot如…

前端面试高频题精讲(一)

HTML篇 什么是语义化 用正确的标签做正确的事情。例如&#xff1a;段落用 p 标签&#xff0c;标题用 h 系列标签。 便于团队的开发和维护&#xff0c;我见过用div走天下的&#xff0c;但不利于看清页面结构。在没有加载 CSS 的情况下也能呈现较好的内容结构与代码结构&#xf…

Ubuntu18.04/20.04/22.04的Apollo8.0软件包安装(免编译)

本文主要介绍在如何使用软件包&#xff08;即 deb 包&#xff09;的方式来安装 Apollo&#xff0c;相对于源码方式安装&#xff0c;软件包安装方式不需要编译&#xff0c;更加快捷。但是对环境的支持比较单一&#xff0c;如果在自定义环境内安装&#xff0c;请移步源码安装方式…

camunda流程引擎connector如何使用

在 Camunda 中&#xff0c;Connector 是一种用于与外部系统或服务交互的机制。它允许 BPMN 模型中的 Service Task 节点与外部系统或服务进行通信&#xff0c;从而使流程更加灵活和可扩展。使用 Connector&#xff0c;可以将业务流程与外部系统集成在一起&#xff0c;而无需编写…

java商城 java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

一个好的SpringCloudSpringBoot b2b2c 电子商务平台涉及哪些技术、运营方案&#xff1f;以下是我结合公司的产品做的总结&#xff0c;希望可以帮助到大家&#xff01; 搜索体验小程序&#xff1a;海哇 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家…

Python学习27:存款买房(A)

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ 你刚刚大学毕业&#xff0c;…

亚马逊如何提高商品listing转化率?测评自养号优势和技巧有哪些?

之前有讲过&#xff0c;亚马逊店铺流量的几大入口&#xff0c;如何获取流量。那么获取了流量之后&#xff0c;亚马逊卖家就需要考虑到转化率的问题&#xff0c;如果流量来没有转化率&#xff0c;一样不会产生订单。如果转化率太低还会影响到商品的表现&#xff0c;比如排名会下…

亚马逊云科技基础设施为大型模型推理提供技术保障

在2019年的亚马逊云科技re:Invent上&#xff0c;亚马逊云科技发布了新的基础设施Inferentia芯片和Inf1实例。Inferentia是一种高性能机器学习推理芯片&#xff0c;由亚马逊云科技定制设计&#xff0c;其目的是提供具有成本效益的大规模低延迟预测。时隔四年&#xff0c;2023年4…

使用particles动态粒子效果,优化登录页

前言 书接上回&#xff0c;咱不是做了落日余晖登录页&#xff0c;说白了就是一个背景图&#xff0c;感觉需要进一步优化一下&#xff0c;做一个高大上的效果。所图所示&#xff0c;我想要背后的动态粒子效果&#xff0c;这就开搞&#xff0c;基于老的代码&#xff1a;vue2和el…