首页 > 其他分享 >泛型擦除(Generics)

泛型擦除(Generics)

时间:2024-07-28 20:54:11浏览次数:12  
标签:Java 编译 擦除 Generics 类型 泛型 匹配

在Java中,泛型(Generics)的“擦除”机制并不会阻止泛型的使用,反而是在保持向后兼容性和简化JVM设计的同时,允许泛型以一种类型安全的方式被使用。因为泛型的使用主要集中在编译时,当向集合添加不匹配的元素时编译会捕获到类型不匹配的错误。

泛型擦除的含义

  1. 类型信息的移除:在编译过程中,Java编译器会移除所有泛型类型信息,并将它们替换为它们的原生类型(通常是Object,如果指定了类型上限则替换为那个类型)。这个过程被称为类型擦除(Type
    Erasure)。

  2. 保留的元数据:虽然泛型类型信息在字节码中被擦除,但Java编译器会在.class文件中保留一些元数据(如签名信息),以便在需要时可以通过反射来查询这些泛型参数的信息。然而,这些元数据对于大多数Java程序来说是不可见的,并且不会改变泛型在运行时的行为。

泛型的使用

  1. 编译时类型检查:尽管泛型信息在编译时被擦除,但Java编译器在编译时会进行严格的类型检查。这意味着,你可以在编译时捕获到类型不匹配的错误,从而避免在运行时出现ClassCastException等异常。

  2. 类型安全的集合:泛型最常用于集合框架(如ListSetMap等)。通过使用泛型,你可以指定集合中元素的类型,从而在编译时获得类型安全。例如,List<String>确保你只能向列表中添加字符串类型的对象。

  3. 泛型方法和类:你可以定义泛型方法和泛型类,从而在编译时指定类型参数。这使得你的代码更加灵活和可重用。

泛型擦除与使用的关系

泛型擦除并不影响泛型的使用,因为泛型的使用主要集中在编译时,当向集合添加不匹配的元素时编译会捕获到类型不匹配的错误。编译时的类型检查确保了类型安全,而运行时的类型擦除则保证了与旧版本Java代码的兼容性,并简化了JVM的设计。

标签:Java,编译,擦除,Generics,类型,泛型,匹配
From: https://blog.csdn.net/TheMilkyWayisbri/article/details/140631137

相关文章

  • 这一文,关于 Java 泛型的点点滴滴 二 (extends、super、<?> 通配符、泛型与反射)
    本文是《这一文,关于Java泛型的点点滴滴》的第二篇,也是最后一篇。在上一篇文章中我们介绍了关于Java泛型的基础知识,而在本文中,我们将深入Java泛型,介绍了extends、super、<?>通配符,并在最后介绍了使用反射获取泛型信息。在阅读本文之前,请先阅读上一篇文章:这一文,关于Jav......
  • 如何在Python 3.12+中正确使用泛型来提高代码质量?
    我正在尝试使用泛型来改进FastAPI应用程序中的类型注释。我有一个抽象存储库类,在其中使用泛型:fromabcimportABC,abstractmethodfromtypingimportListclassAbstractRepository[T](ABC):@abstractmethodasyncdefadd_one(self,data:dict)->T:......
  • 编程语言之泛型困境
    困境泛型不可能三角泛型困境的本质是,关于泛型,你想要缓慢的程序员、缓慢的编译器和臃肿的二进制文件,还是缓慢的执行时间。简单来说就是:要么苦了程序员,要么苦了编绎器,要么降低运行时效率。不同语言对泛型的考量以C、C++和Java为例,它们在泛型的设计上有着不同考量:C语言:是系统......
  • C++模板——泛型编程
    目录1.什么是泛型编程2.函数模板2.1定义格式2.2实例化及原理 2.3参数匹配原则3.类模板 3.1定义格式3.2实例化 4.非类型模板参数 5.模板的特化 5.1概念5.2函数模板和类模板特化6.模板的分离编译 1.什么是泛型编程 如何实现一个通用的加......
  • C# 通过反射(Reflection)调用不同名泛型方法
    概述由于工作需要,需要通过数据类型和方法名控制方法走向用到的数据类型有8种(string,Int16,Int32,Int64,Boolean,Byte,Single,Double)读取的方法(参数一致,但是数据不同的泛型方法,返回值也是泛型)暂时只有11种,但肯定的是,后续一定会增加原本计划排列组合,写个88行代码,但是总觉得重复......
  • 泛型
    1.泛型类的示例:2.泛型接口的示例: 3.系统数据类型中泛型的示例: 4.泛型方法中例子: 5.泛型委托的示例: 6.泛型委托和Lam表达式 ......
  • 思维滑坡之问c# 泛型约束可以限制成int吗
    在C#中,泛型约束通常用来限制泛型类型参数必须满足某些条件。然而,C#不允许直接将泛型类型参数限制为特定的基本类型,比如int。这是因为泛型设计的主要目的是为了类型安全性和重用性,而直接限制到某个特定的基本类型则违反了这一目的。尽管如此,您可以通过一些间接的方式来达到类似......
  • 非泛型类方法上的字典类型变量
    在以下代码中:fromtypingimportGenericfromtypingimportTypeVarfromtypingimportreveal_typeT=TypeVar('T')classField(Generic[T]):"""Afielddefinitionwithadefaultvalue."""def__init__(self,......
  • Java 随笔记: 集合与泛型
    文章目录1.集合框架概述2.集合接口2.1Collection接口2.2List接口2.3Set接口2.4Map接口3.集合的常用操作3.1添加元素3.2删除元素3.3遍历元素3.4判断大小3.5判断是否为空4.迭代器4.1迭代器的作用4.2迭代器的使用4.3迭代器与增强for循环4.4迭代器......
  • 深入理解Java中的泛型与类型安全
    深入理解Java中的泛型与类型安全大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨Java中的泛型和类型安全。泛型是Java的一个强大特性,它使得代码更加通用、灵活,同时保持了类型安全。1.泛型概述1.1什么是泛型泛型允许我们在定义类、......