请查看Java的通用名称。编译后会发生什么?

通用Java的引入提高了参数类型的安全性并减少了类型转换。这类似于C ++模板(Temeplates),但不同之处在于Java泛型在编译器中是有效的。我们来看一个编辑示例。程序非常简单,四种方...


通用Java的引入提高了参数类型的安全性并减少了类型转换。这类似于C ++模板(Temeplates),但不同之处在于Java泛型在编译器中是有效的。我们来看一个编辑示例。程序非常简单,四种方法已被写入,arrayMethod方法接受字符串矩阵和整数矩阵listMethod将收到一个列表变量与字符串和整数元素的类型。
现在的问题是,这个程序可以编译吗?
否则
问题出在哪里?
实际上,我们无法编译这个程序,编译时的错误信息如下。这个错误的含义:它只是说,该方法的签名是重复的,其实,listMethod(ListintList)方法后,该方法名单已在编译时被删除(ListintList)的列表中不同的方法反复我会的。
由于一般的Java删除,这是一个问题。编译后会转换所有常见类型。
转换规则如下。删除列表,列表和列表,类型为列表列表[],删除后的类型为列表[]。
列表和列表清除后的类型是List。
删除列表后的类型是Listserializable =“”。
了解这些规则后,请遵守以下代码。编译擦除处理后,上述代码与以下程序一致。Java编译后的字节码中没有一般信息,即大纲。与常规类相同类型的Foo类将在编译后指向与Foo类相同的字节码。编译后,只有一个Foo。
类类,Foo或Foo是相同的字节码。
Java以这种方式处理有两个原因。这是为了避免JVM的重大变化。
通用C ++生命周期在运行时继续,Java在编译时被删除。我们相信,如果JVM将泛型类型扩展到运行时,我们将需要对JVM进行大量重构。
版本兼容性:编译时擦除可以更好地支持Java 1本机类型(RawType)。
5或1
6
在平台上,即使将本机类型声明为List,也可以按常规方式编译它,但只生成警告消息。
当理解Java泛型是类型擦除,它可以解释以下问题:通用类对象是一样的:每个类都有一个类的属性,泛型更改类属性的返回值我不会。之前的代码返回true,原因很简单,列表和列表后面的类型被清除但没有区别。
2
通用数组不能在初始化时声明。无需编译即可编译以下代码。原因很简单。是否有可能宣布使用泛型参数数组,但在执行删除操作的类型,列表[]和列表[]是一样的,你将无法初始化数组。
3
Instanceof不允许通用参数。以下代码无法编译。出于同样的原因,删除了泛型类型。

相关文章