java范例擦除真的能完整擦除统统信息吗?【JAVA教程】,类型擦除,java,泛型
作者:搜教程发布时间:2019-11-29分类:JAVA教程浏览:25评论:0
背景:我们都晓得泛型本质上是供应范例的"范例参数",它们也被称为参数化范例(parameterized type)或参量多态(parametric polymorphism)。实在泛型头脑并非 Java 最早引入的,C++ 中的模板就是一个应用泛型的例子。
(引荐视频:java视频教程)
GJ(Generic Java)是对 Java 言语的一种扩大,是一种带有参数化范例的 Java 言语。用 GJ 编写的顺序看起来和平常的 Java 顺序基础雷同,只不过多了一些参数化的范例同时少了一些范例转换。实际上,这些 GJ 顺序也是起首被转化成平常的不带泛型的 Java 顺序后再举行处置惩罚的,编译器自动完成了从 Generic Java 到平常 Java 的翻译。
什么是实在的java泛型
我们都晓得编译器会举行泛型擦除,编译器能够在对源顺序(带有泛型的 Java 代码)举行编译时运用泛型范例信息保证范例平安,对大批假如没有泛型就不会去考证的范例平安束缚举行考证,同时在生成的字节码当中,将这些范例信息清撤除。下面我们先考证一下:
public static void main(String[] args) { ArrayList<Integer> ints = new ArrayList<Integer>(); ints.add(1); ints.add(2); ints.add(3); ArrayList<String> sts = new ArrayList<String>(); sts.add("a"); sts.add("b"); sts.add("c"); System.out.println(ints.getClass() == sts.getClass()); }
上面打印的结果是true,原因是
根据明白,泛型擦除后将不能找回本来的范例,都是Object情势的,真的云云吗?
看一下以下代码:
import java.lang.reflect.ParameterizedType;import java.util.ArrayList;import java.util.List;public class ClassTest { public static void main(String[] args) throws Exception { ParameterizedType type = (ParameterizedType) Bar.class.getGenericSuperclass(); System.out.println(type.getActualTypeArguments()[0]); ParameterizedType fieldType = (ParameterizedType) Foo.class.getField("children").getGenericType(); System.out.println(fieldType.getActualTypeArguments()[0]); ParameterizedType paramType = (ParameterizedType) Foo.class.getMethod("foo", List.class) .getGenericParameterTypes()[0]; System.out.println(paramType.getActualTypeArguments()[0]); System.out.println(Foo.class.getTypeParameters()[0] .getBounds()[0]); } class Foo<E extends CharSequence> { public List<Bar> children = new ArrayList<Bar>(); public List<StringBuilder> foo(List<String> foo) {return null; } public void bar(List<? extends String> param) {} } class Bar extends Foo<String> {} }
打印出
class java.lang.Stringclass com.javapuzzle.davidwang456.ClassTest$Barclass java.lang.Stringinterface java.lang.CharSequence
你会发明每个范例参数都被保存了,而且在运行期能够经由过程反射机制获取到。那末究竟什么是“范例擦除”?最少某些东西被擦除了吧?是的。事实上,除了构造化信息外的统统东西都被擦除了 —— 这里构造化信息是指与类构造相干的信息,而不是与顺序实行流程有关的。换言之,与类及其字段和要领的范例参数相干的元数据都会被保存下来,能够经由过程反射获取到。
本文来自ki4网,java教程栏目,迎接进修!
以上就是java范例擦除真的能完整擦除统统信息吗?的细致内容,更多请关注ki4网别的相干文章!
相关推荐
- java经典面试题集锦(五)_JAVA教程,java,面试题
- java中的换行符是什么_JAVA教程,java,换行符
- Java中变量必须先定义后使用么_JAVA教程,java,变量
- java中怎么定义接口_JAVA教程,java,接口
- java中静态代码块有什么特点_JAVA教程,java,静态代码块
- java中return语句有什么作用_JAVA教程,java,return
- Java对文件的读写操作(图文详解)_JAVA教程,java
- java经典面试题集锦(四)_JAVA教程,java,面试题
- 八种基本数据类型分别是什么?_JAVA教程,java,基本数据类型
- java如何将字符串转为数组_JAVA教程,java,字符串,数组
你 发表评论:
欢迎- JAVA教程排行
-
- 1接口中只能定义常量和抽象方法,对么_JAVA教程,接口,常量,抽象方法
- 2java文件不能删除文件怎么办_JAVA教程,java
- 3java中sleep的用法是什么?_JAVA教程,java,sleep
- 4java eclipse无法运行怎么办_JAVA教程,java
- 5java图片显示不出来怎么办_JAVA教程,java
- 6java后台乱码怎么办_JAVA教程,java
- 7javascript和java的区别是什么_JAVA教程,javascript,java
- 8Java中split()方法怎么用_JAVA教程,java,spilt,用法
- 9java生成随机数的三种方法_JAVA教程,java,随机数
- 最新文章
- 广而告之