【八股】泛型

泛型存在的意义?

为了使相同的代码适用于多种数据类型,也就是代码复用。

参数类型上下限限制

  1. <?> 无限制
  2. <? extends E> 声明了类型的上界,表示参数类型可以是他或他的子类。
  3. <? super E> 声明了类型的下界,表示参数类型可以是他或他的父类。

类型擦除

Java泛型这个特性是JDK 1.5才引入的,所以为了兼容之前没有泛型的版本,java的泛型策略是,Java在语法上支持泛型,但在编译阶段会进行类型擦除
类型擦除,就是根据把原类型替换为其原生类型,如果没有限制就替换为Object,如果有上下界限定就替换为原类型的最上界(比如 <T extends number>的类型参数T就被替换为Number,<T super Number>的类型参数T就被替换为Object

拓展:
这个类型擦除也可以引出另一个问题, 为什么要有包装类? 因为基本类型不能作为泛型参数,只有引用类型能作为泛型参数。为什么基本类型不能作为泛型参数? 因为java的泛型策略是,Java在语法上支持泛型,但在编译阶段会进行类型擦除

以下一段代码可以证明Java泛型的类型擦除:

public class Main {public static void main(String[] args) throws Exception {ArrayList<Integer> list = new ArrayList<Integer>();list.add(1);  //这样调用 add 方法只能存储整形,因为泛型类型的实例为 Integerlist.getClass().getMethod("add", Object.class).invoke(list, "asd");for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}}
}

在这里插入图片描述
定义了一个泛型类型Integer为ArrayList,但当我们利用反射调用ArrayList的add()方法时,却可以存储字符串,说明Integer在编译之后被擦除掉了,只保留了原始类型。原始类型就是擦除了泛型信息后,最后在字节码中的真正类型。

类型擦除的流程

Java编译器是先检查泛型的类型,然后进行类型擦除,最后编译。

public static void main(String[] args) throws Exception {ArrayList<String> list = new ArrayList<String>();list.add("123");list.add(123);//编译错误  java: 不兼容的类型: int无法转换为java.lang.String
}

这段代码编译会报错。说明检查在编译之前,如果检查在编译之后,编译之后变成原始类型Object了,那就不会报错了。
对谁检查?检查是对引用调用的方法进行类型检查,比如上面这段代码就是对list调用的方法里面的参数进行类型检查。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32之HAL开发——串口配置(源码)

串口收发原理框图&#xff08;F1系列&#xff09; 注意&#xff1a;数据寄存器有俩个一个是收一个是发&#xff0c;但是在标准库或者HAL库中没有特别区分开来是俩个寄存器&#xff01; USART 初始化结构体详解 HAL 库函数对每个外设都建立了一个初始化结构体&#xff0c;比如 …

2024年妈妈杯数学建模思路B题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

ethers.js:sign(签名)

Signers 在ethers中Signer是以太坊账户的抽象&#xff0c;可以用来签名消息和交易&#xff0c;如将签名的交易发送到以太坊网络以执行状态更改的操作。 npm install ethers5.4.0// 引入 import { ethers } from ethers签名 this.provider new ethers.providers.Web3Provider(…

Docker安装xxl-job并整合到SpringBoot项目

1. 创建数据库 执行如下SQL语句创建相关表 CREATE database if NOT EXISTS xxl_job default character set utf8mb4 collate utf8mb4_general_ci; use xxl_job;SET NAMES utf8mb4; CREATE TABLE xxl_job_info (id int(11) NOT NULL AUTO_INCREMENT,job_group int(11) NOT NUL…

基于java+springcloud的分布式架构网上商城

开发语言&#xff1a;Java 框架&#xff1a;springcloud JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Mave…

Python 垃圾回收和弱引用(Weakref)

Python中的赋值语句是建立变量名与对象的引用关系&#xff0c;多个变量可以引用同一个对象&#xff0c;当对象的引用数归零时&#xff0c;可能会被当作垃圾回收。而弱引用即可以引用对象&#xff0c;又不会阻止对象被当作垃圾回收&#xff0c;因此这个特性非常适合用在缓存场景…

报错 /core/library/think/cache/driver/File.php 第 126 行左右(已解决)

报错 /core/library/think/cache/driver/File.php 第 126 行左右 解决方法&#xff1a; 网站后台版本低于v1.5.2出现的缓存问题&#xff0c;如果无法登录后台了&#xff0c;就通过FTP&#xff0c;把 /data/runtime 里的都删掉&#xff0c;然后进后台升级到最新版 一、进入宝…

vmWare虚拟机下载安装详细教程,手把手一步一步教学

一.下载 先去官网下载vm 官网地址:https://www.vmware.com/ 官网下载速度太慢了 国内应用商店或者别的下载地址:vmware下载_vmware下载免费中文版客户端[虚拟机]-下载之家 然后再去下载一个镜像 地址是:Index of /centos/7/isos/x86_64/ 我个人下载的是这个 ,看各位的需求…

【Java】ArrayList数组的扩容机制 jdk1.8

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 ArrayList和普通数组不同&#xff0c;ArrayList支持动态扩容&#xff0c;那么ArrayList到底是如何扩容的呢&#xff1f;你又是否知道ArrayList数组的初始长度是多少呢&#xff1f; 在开始介绍之前&#xff0c;我们要先介…

代码随想录阅读笔记-二叉树【翻转二叉树】

题目 翻转一棵二叉树。 思路 如果要从整个树来看&#xff0c;翻转还真的挺复杂&#xff0c;整个树以中间分割线进行翻转&#xff0c;如图&#xff1a; 可以发现想要翻转它&#xff0c;其实就把每一个节点的左右孩子交换一下就可以了。 关键在于遍历顺序&#xff0c;前中后序应…

2024年妈妈杯数学建模思路A题B题C题D题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

​马来语翻译中文去哪比较好?

据了解&#xff0c;马来语是马来西亚、文莱的官方语言&#xff0c;也是新加坡的官方语言之一&#xff0c;马来语跟印尼语是同一种语言&#xff0c;它在整个东南亚有着极大的影响力。如今在国内市场上&#xff0c;马来语翻译的需求也是供不应求&#xff0c;那么&#xff0c;如何…