泛型擦除是什么?

server/2024/11/29 3:56:37/

泛型擦除(Type Erasure)是Java编译器在编译泛型代码时的一种机制,它的目的是确保泛型能够与JAVA的旧版本(即不支持泛型的版本)兼容。泛型擦除会在编译时移除泛型类型信息,并将泛型类型替换为其非泛型的上限类型(通常是Object)

详细解释

在Java中,泛型信息只存在于源代码和编译时,在运行时,所有的泛型类型信息都会被擦除。这意味着在运行时,所有泛型类型都被替换为它们的上限类型(如果没有指定上限,则默认为Object).

示例

考虑一个简单的泛型类:

java">public class Box<T> {private T value;public void setValue(T value) {this.value = value;}public T getValue(){return value;}}

 在编译时,泛型类型T会被擦除,并替换为它的上限类型。在这个例子中,因为,没有指定上限类型,T会被替换为uObject。编译后的代码大致如下:

java">public clss Box {private Object value;public void setValue(Object Value){this.value = value;}public Object getValue(){return value;}
}

类型擦除的影响

1.运行时类型检查:由于泛型类型信息在运行时被擦除,无法在运行时回去泛型类型的信息。例如,不能使用instanceof操作符检查泛型类型。

java">Box<String> stringBox = new Box<>();
if (stringBox instanceof Box<String>) { // 编译错误// ...
}
  1. 泛型数组:不能创建泛型类型的数组,因为在运行时无法确定泛型类型。

java">List<String>[] stringLists = new List<String>[10]; // 编译错误
  1. 类型安全:在编译时进行类型检查,确保类型安全。然而,由于类型擦除,在某些情况下仍可能出现类型转换异常。

java">List<String> stringList = new ArrayList<>();
List rawList = stringList; // 允许,但不安全
rawList.add(123); // 编译时不报错,但运行时可能导致问题
String str = stringList.get(0); // 运行时抛出ClassCastException

限制

  1. 静态上下文中使用泛型:不能在静态字段或静态方法中使用类型参数,因为类型参数是在实例化时才指定的,而静态成员与具体实例无关。

java">public class GenericClass<T> {private static T value; // 编译错误public static T staticMethod(T param) { // 编译错误return param;}
}
  1. 泛型实例化:不能直接实例化泛型类型,因为在运行时泛型类型信息已经被擦除。

java">public class GenericClass<T> {public void createInstance() {T obj = new T(); // 编译错误}
}


http://www.ppmy.cn/server/145806.html

相关文章

Spring 小案例体验创建对象的快感(Java EE 学习笔记05)

我们了解了Spring的特性及功能后&#xff0c;接下来我们利用下面的小案例来体验以下Spring的使用方式。 首先创建项目 打开IDEA&#xff0c;选择new工程&#xff0c;如下图&#xff1a; ​ 然后&#xff0c;指定工程名字为SpringDemo&#xff0c;并且指定工程目录为D盘。配…

【Python爬虫五十个小案例】爬取豆瓣电影Top250

博客主页&#xff1a;小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介&#xff1a;分享五十个Python爬虫小案例 &#x1fab2;前言 在这篇博客中&#xff0c;我们将学习如何使用Python爬取豆瓣电影Top250的数据。我们将使用requests库来发送HTTP请求&#xff0c;…

Spring Boot开发实战:从入门到构建高效应用

Spring Boot 是 Java 开发者构建微服务、Web 应用和后端服务的首选框架之一。其凭借开箱即用的特性、大量的自动化配置和灵活的扩展性&#xff0c;极大简化了开发流程。本文将以实战为核心&#xff0c;从基础到高级&#xff0c;全面探讨 Spring Boot 的应用开发。 一、Spring B…

命令行版 postman 之 post 小工具

依赖 curljq post.sh #!/bin/bashBASEhttp://119.119.119.119 METHOD$1 URL$BASE/$2 LOGIN$BASE/login echo $URL token$(curl --silent $LOGIN -H Accept: application/json, text/plain, */* -H Accept-Language: zh-CN,zh;q0.9 -H Connection: keep-alive -H Con…

JSON数据转化为Excel及数据处理分析

在现代数据处理中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;因其轻量级和易于人阅读的特点而被广泛使用。然而&#xff0c;有时我们需要将这些JSON数据转化为Excel格式以便于进一步的分析和处理。本文将介绍如何将JSON数据转化为Excel文件&#xff0…

网络安全笔记

# 网络安全概述 ### 网络安全的特征 - **机密性&#xff1a;信息不泄露给非授权的实体或对象** - **完整性&#xff1a;数据未经授权不能进行改变的特性&#xff0c; 即信息在存储或传输过程中保持不被修改&#xff0c;不被破坏的特性** - **可用性&#xff1a;可被授权实体访…

java基础知识(常用类)

目录 一、包装类(Wrapper) (1)包装类与基本数据的转换 (2)包装类与String类型的转换 (3)Integer类和Character类常用的方法 二、String类 (1)String类介绍 1)String 对象用于保存字符串,也就是一组字符序列 2)字符串常量对象是用双引号括起的字符序列。例如:&quo…

数据结构:链表进阶

链表进阶 1. ArrayList的缺陷2. 链表2.1 链表的概念及结构2.2 链表的实现 3.链表面试题4.LinkedList的使用5.1 什么是LinkedList4.2 LinkedList的使用 5. ArrayList和LinkedList的区别 1. ArrayList的缺陷 通过源码知道&#xff0c;ArrayList底层使用数组来存储元素&#xff1…