一代是Java的非常重要的语法糖果。本文将介绍从浅层到深处。首先介绍Java中通用类型的基本概念,实施方式和用法,并最终将其与其他语言的通用实施进行比较它的优势和缺点。
通用类型的本质是参数化类型。这是一个特殊的参数,只能签署操作数据类型的数据类型。它可以用于类,接口和方法。
通用类型是JDK1.5的新功能。实际上,这是一种“语法糖”(即编译器提供的小含义,以提供更好的可读性)。“类型”的概念。
为什么必须有仿制药?请参阅以下代码:
如果没有通用类型,则集合中的每个元素的类型显然应该对象。只有以这种方式包括所有类型。这将引起两个问题:
1.操作集将变得非常不便,并且对象的类型需要很强。
2.当强烈旋转时,不同的数据类型会有异常。添加类型的判断将增加代码复杂性,但其他人不知道该集合是什么,因为此集合不安全。
实际上,以上是一般类型与唯一性之间的矛盾。通用类型是统一这两个矛盾的方法。
那么,通用类型的好处是什么?其主要表现是两个点:首先,通过对仿制药的语法定义,编译器可以在编译期间提供某种类型的安全检查,从而滤除了由大多数运行时异常造成的。不一致的类型,例如:
由于我们的ArrayList是由通用语法定义的容器,因此您可以在实例化时指定类型,从而限制容器只能容纳整数类型元素。如果您强行添加其他类型的元素输入,则编译器将不会通过。
其次,仿制药可以使程序代码的可读性更高,并且由于它只是语法糖,因此对JVM的性能没有影响。
Java中的通用类型仅存在于源代码程序中。在编译的字节码中,所有通用类型都被原始的裸体类型替换。换句话说,通用信息不会进入运行时阶段。
裸体类型:例如,ArrayList<>裸体类型为arraylist。
首先,以下代码及其输出
汇编后,它们的类型已成为裸体类型的ArrayList,因此最终输出是正确的,这进一步验证了我们的观点。
为了进一步验证,编译上诉代码,在Javap编译了类文件之后,获得的代码如下:
可以看出,验证是正确的,并且确实执行了类型的擦除。专业的读者可能会发现hua dian?a,您擦拭了类型,如何确定添加了哪种类别,您不会报告错误何时打电话?这是不是回到之前的时间?的确,Java编译器在此处处理,例如以下代码:
代码后反向编译:
可以看出,实际上,当Java访问该元素时,执行了一种强制性转换。。这将导致无数的自动拳击和打开包装,这也是Java缓慢生成的重要原因。
简而言之,Java通过“通用刮擦”来实现仿制药。当访问元素时,必要时类型将很强。
本文刚刚开始,可以在类,接口和方法中使用通用类型。通用使用的使用大致如下:
以下将详细说明。
通用类型在类的定义中使用,称为通用类型。通过通用,可以向公众打开相同的接口。最典型的是各种容器类,例如列表,设置,地图。
例如:
定义的通用类是否被传递到遗传人参中?事实并非如此。如果在使用通用类型时引入仿制药,则将根据传输的高山人参进行相应的限制。目前,通用类型将发挥限制。如果未将其引入遗传人参,那么遗传类别中成员变量定义的通用方法的类型或类型可以是任何类型。
值得注意的是,通用参数只能是类类型,不能是简单的类型。
通用接口和通用类型的定义和使用基本上是相同的。发现的界面通常在各种类型的生产中使用,您可以看到一个示例:
当实现一类通用接口时,未在可靠的参数中引入它:
当实现通用接口的类时,将仿制药引入通用参数时:
通用方法是指调用该方法时指示特定类型的通用类型。
例如:
Java仿制药用于解决仿制药之间传输问题的特殊语法,主要是在以下三个类别中:
常见的通用参数名称如下:
e:element(在集合中使用,因为该元素存储在集合中)t:type(java)k:key(key)v:value(value)n:nmumb(数值)?:表达不确定的Java类型
在Java中,通常被称为原因是因为在实际代码的操作中,删除了实际类型参数的信息[type Erasure](在上一个原理中提到)。仅在汇编之前才存在。这是什么原因导致Java做出这样的妥协?以下文章将从通用设计开始并讨论此问题。
C#使用“真正的创世纪”。在理解Java“伪属”之前,让我们简要地谈论“真实通用”和“伪属”之间的区别。
实际上,这很简单。如果您不擦除它,那是真正的通用类型。
一般的编程语言被引入通用想法中,该想法在编译过程中进行了扩展,也就是说,在编译时,添加了该字段以区分通用类型和原始类型。
以“真实的通用”为java语言的示例。这是通用类型的基础。方法可以临时使用该位置,并且Java编译器可以知道这是一个占位符。在编译过程中的正确使用,复制徽标的所有逻辑,创建一个新类并替换原始占位符,然后在编译过程中生成它。
举例来说,它生成的代码是:
举例来说,它生成的代码是:
因为不同类别的替代了不同的类别,并且已经确认了通用类型中的类型。因此,我们可以在程序中执行此操作:
仅在技术方面,Java就可以完全意识到我们所说的“真正的通用”。但要考虑的是:Java起初没有通用,在后续版本中添加了仿制药。“ Java语言规范”说,有必要说明有必要的是必要的。确保“二进制系统兼容性”。例如,必须在JDK1.2中编译的类文件以JDK12和更高版本运行。这意味着未突然出现的限制。
为了确保JDK1.2编译的类文件可以在将来继续运行,设计师有大约两种选择:
1.原始类型保持不变,并并联添加新类型的遗传版本。(保持arraylist不变,加入arraylist<>本质)2。直接不添加新类型的原始类型。(将ArrayList转换为ArrayList。)。
C#选择了第一种方法,我们以以下Java为例进行了以下修改。也就是说,新的Java.util.gneric。
Java选择了第二种方式,为什么要考虑Andyjennifer的文章中提到的情况。
如果我有一个项目A和第三方的B1 lib,其中一些项目由一个项目引用。随着Java的升级,B1 LIB的开发人员在此之前,该代码被迁移到Java 5并重新生成B2 lib。然后,A项目必须与B2 LIB兼容,因此A项目必须升级到Java 5并同时修改代码。
为什么必须在项目A中升级Java 5?
JRE的低版本JRE在JRE中运行的JAVA中不支持的类文件。如果您尝试执行此操作,则将获得未匹配的ClassversionError错误。如下所示:
因此,该项目A应该适用于B2 Lib,并且Java必须升级到Java 5。
由于Java当时有将近十年的历史,因此Java版本的迭代已从1.0迭代到5.0。刚刚发布了两年的开源框架和有多少个项目。C#剩下的代码较少。
因此,Java通过该类型解决了本汇编“魔术”的问题,以消除旧版本的问题。我们在本文中的通用类型中所说的那样,在处理编译器后,新版本具有删除了通用类型,该类型与没有通用类型的旧版本兼容。
因此,即使伪形类型有这样的问题,它也达到了不同版本的兼容性,值得尊重。
参考资料:
1.https://juejin.cn/post/684490362279430152
2.https://www.cnblogs.com/blue-reeroro/p/8875898.html
3.https://juejin.cn/post/6844904134273925134
原始:https://juejin.cn/post/70963963429776926