Java泛型6——类型擦除

news2024/11/18 23:20:55

注:以下内容基于Java 8,所有代码都已在Java 8环境下测试通过

  • Java泛型1——概述
  • Java泛型2——泛型类
  • Java泛型3——泛型接口
  • Java泛型4——泛型方法
  • Java泛型5——泛型通配符
  • Java泛型6——类型擦除

1. 什么是类型擦除

泛型是在Java 1.5被引进的,但是泛型代码可以和之前的版本兼容,原因就是泛型只存在代码编译阶段,编译后的字节码中(也就是运行时)不包含泛型中的类型信息。使用泛型时,泛型相关的类型参数信息会在编译时被擦除掉,这个过程被称为类型擦除。比如:

import java.util.LinkedList;

public class Main {
    public static void main(String[] args) {
        LinkedList<Integer> i = new LinkedList<>();
        LinkedList<String> s = new LinkedList<>();

        System.out.println("i:" + i.getClass());
        System.out.println("s:" + s.getClass());
    }
}

请添加图片描述

从运行结果可以看到,虽然为 is 指定了不同的类型参数,但在运行时它们实际上是同一种类型(都是 LinkedList )。这就是类型擦除的作用,在编译时将代码中的类型参数擦除只保留原始类型

2. 原始类型

原始类型是擦除了泛型信息后字节码中的类型,无论何时定义一个泛型类型,相应的原始类型都会被自动地提供。类型参数信息被擦除只会保留原始类型。根据是否限定类型,原始类型替换有以下两种情况:

2.1 无限定类型

将类型参数替换为Object。例如:

class Test<T> {
    private T value;

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }
}

类型擦除后:

class Test {
    private Object value;

    public Object getValue() {
        return value;
    }

    public void setValue(Object value) {
        this.value = value;
    }
}

2.2 有限定类型

将类型参数替换为上限或下限。例如:

class Test<T extends Number> {
    private T value;

}

类型擦除后:

class Test {
    private Number value;
}

3. 类型擦除原理

Java在编译时进行泛型的类型擦除,但在进行类型擦除时会将传入的类型参数记录下来。当对被擦除后的泛型对象操作时编译器会根据记录的类型参数对其进行类型转换,将其从原始类型转换为未传入的参数类型。

4. 类型擦除带来的问题

主要有以下几点(部分问题在之前已经说过了,如泛型变量不能是基本数据类型,具体内容可参考CSDN博客):

  • 引用传递问题
  • 自动类型转换问题
  • 类型擦除与多态冲突
  • 泛型变量不能是基本数据类型
  • 运行时类型检查异常
  • 泛型异常捕获
  • 不能创建泛型类型数组
  • 不能实例化泛型类型
  • 类型擦除后的冲突
  • 不能使用静态域

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

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

相关文章

sqlserver 使用SQLOLEDB 远程数据库同步数据

exec sp_addlinkedserver remote_server, , SQLOLEDB, ip exec sp_addlinkedsrvlogin remote_server, false,null, 账号, 密码 --查询方式 select * from remote_server.数据库名.dbo.表名 --不再使用时删除链接服务器 exec sp_dropserver remote_server, droplogins…

时序数据库 TDengine 与 WhaleStudio 完成相互兼容性测试认证

近年来&#xff0c;开源及其价值获得社会各界的广泛认可&#xff0c;无论是国家政策导向还是企业数字化转型&#xff0c;都在加速拥抱开源。对于如操作系统、数据库等基础软件来说&#xff0c;开源更是成为驱动技术创新的有力途径。 在此背景下&#xff0c;近日&#xff0c;涛…

前沿分享-会发电的水凝胶敷料

四川大学的研究团队设计了一种新型的伤口敷料&#xff0c; 将电刺激治疗引入伤口敷料&#xff0c;达到营造湿润环境的同时利用电刺激来加速愈合的效果。 上半部分由树状纳米纤维构成&#xff0c;下半部分由双网络导电水凝胶构成&#xff0c;加入了铁离子和儿茶酚。该部分用于贴…

Unity数字可视化学校_昼夜(一)

maya2022:链接&#xff1a;https://pan.baidu.com/s/1cvB438UKsv_tU37NsOaNow 3dmax软件合集:百度网盘 请输入提取码 1180 1、 2、unity3d 导入插件 &#xff1a; &#xff08;1&#xff09;UniStorm - Volumetric Clouds Sky 5.3.0.unitypackage &#xff08;天气&…

coopeliasim的光lights

光源是允许您照亮场景的对象。场景中没有任何光线的情况下&#xff0c;对象将以无阴影的颜色显示&#xff08;在这种情况下&#xff0c;对象仅使用可在环境对话框中设置的环境光组件照明&#xff09;。下图说明了场景中灯光的效果&#xff1a; [场景照明 &#xff08;1&#xf…

安达发|APS适用于什么场景

APS适用于什么场景 使用Excel进行生产计划和排程&#xff0c;然而在我国很多的小微企业中&#xff0c;很多都是用EXCEL甚至手工进行生产计划和排程&#xff0c;不能实现系统优化生产计划和排程(APS)的智能制造是伪概念的智能制造。 智能制造过程中&#xff0c;必然涉及系统优…

数据结构【第2章】——算法

算法 算法是解决特定问题求解步骤的描述&#xff0c;在计算机中表现为指令的有限序列&#xff0c;并且每条指令表示一个或多个操作。 注&#xff1a;算法定义中&#xff0c;提到了指令&#xff0c;指令能被人或计算装置执行。它可以是计算机指令&#xff0c;也可以是我们平时…

基于基于Web停车场管理系统的设计与实现-【开题报告】

文章目录 本系列校训毕设的技术铺垫文章主体层次选题目的和意义&#xff1a;课题研究目标、内容和手段&#xff1a;系统功能设计&#xff08;论文&#xff09;提纲&#xff1a;日程安排&#xff1a;参考文献 配套资源 本系列校训 互相伤害互相卷&#xff0c;玩命学习要你管&am…

机房环境、动力、网络、安防,帮您提高运维效率,确保机房安全

机房作为单位的核心部门&#xff0c;由计算机、服务器、网络设备、存储设备等关键设备组成&#xff0c;智能化计算机机房这个概念在各个领域中&#xff0c;已经占据了很重要的地位&#xff0c;伴随着国家大力倡导的&#xff0c;东数西算&#xff0c;数字经济、云计算、5G大数据…

FastAPI 是什么?小白必看

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建基于 Python 的 API。它是一个开源项目&#xff0c;基于 Starlette 和 Pydantic 库构建而成&#xff0c;提供了强大的功能和高效的性能。 FastAPI 官网地址&#xff1a;FastAPI FastAP…

Handler源码详解

Handler在Android开发中经常使用&#xff0c;我们从经常使用的sendMessage 看一下Handler的源码&#xff1a; 实际是调用了sendMessageDelayed,只不过delayMillis0了。 接着调用了 sendMessageAtTime函数 引出一个很重要的角色MessageQueue消息队列&#xff0c;enqueueMessag…

uniapp uview文件上传的文件不是文件流,该如何处理?用了uni.chooseImage预览功能要如何做

在使用uniapp开发&#xff0c;运用的ui是用uview&#xff0c;这边需要做一个身份认证&#xff0c;如下图 使用的是uview的u-upload组件&#xff0c;可是这个组件传给后端的不是文件流 后端接口需要的是文件流格式&#xff0c;后面使用了uniapp的选择图片或者拍照的api&#x…

Sentaurus TCAD 频繁跳出窗口

软件提示激活窗口&#xff0c;想要永久去掉这个窗口&#xff0c;需要进入root权限后复制下面的代码&#xff0c;然后回车运行 sed -i “s|enabled1|enabled0|g” /etc/yum/pluginconf.d/fastestmirror.conf mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Bas…

Redis主从复制、哨兵机制、集群分片

一.主从复制 1.概述 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(master)&#xff0c;后者称为从节点(slave)。 数据的复制是单向的&#xff0c;只能由主节点到从节点。默认情况下&#xff0c;每台Redis服务器都是主…

变透明的黑匣子:UCLA 开发可解释神经网络 SNN 预测山体滑坡

内容一览&#xff1a;由于涉及到多种时空变化因素&#xff0c;山体滑坡预测一直以来都非常困难。深度神经网络 (DNN) 可以提高预测准确性&#xff0c;但其本身并不具备可解释性。本文中&#xff0c;UCLA 研究人员引入了 SNN。SNN 具有完全可解释性、高准确性、高泛化能力和低模…

vue3 vant组件的引入方式

vue3中如何使用vant组件 创建项目及环境&#xff1a;vue3 ts vite 一、全局组件全部引用 注意&#xff1a;配置 unplugin-vue-components 插件后&#xff0c;将不允许以这种方式导入组件 1.安装vant 在项目目录下运行 npm i vant // Vue 3 项目&#xff0c;安装最新版 Va…

【雕爷学编程】Arduino动手做(180)---Seeeduino Lotus开发板3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

大数据学习教程:Linux 高级教程(上)

一、Linux用户与权限 1. 用户和权限的基本概念 1.1、基本概念 用户 是Linux系统工作中重要的一环, 用户管理包括 用户 与 组 管理 在Linux系统中, 不论是由本级或是远程登录系统, 每个系统都必须拥有一个账号, 并且对于不同的系统资源拥有不同的使用权限 对 文件 / 目录 的…

【Linux学习】日积月累——进程控制

一、进程创建 1.1 fork函数的认识 #include<unistd.h> pid_t fork(void); 返回值&#xff1a;自进程返回0&#xff0c;父进程返回子进程PID&#xff0c;出错返回-1进程调用fork&#xff0c;当控制转移到内核中的fork代码后&#xff0c;内核做&#xff1a;分配新的内存块…

英语不好能学好Python吗?Python常用英文单词汇总

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 有些小可爱对英语好不好对学习python有没有什么影响有着很深的疑惑。 其实python学习&#xff0c;主要靠多敲多练&#xff0c;主打一个熟能生巧 那今天我就给大家带来Python常用英文单词汇总&#xff0c; 新手期小可…