旗下导航:搜·么
当前位置:网站首页 > JAVA教程 > 正文

java范例擦除真的能完整擦除统统信息吗?【JAVA教程】,类型擦除,java,泛型

作者:搜教程发布时间:2019-11-29分类:JAVA教程浏览:25评论:0


导读:背景:我们都晓得泛型本质上是供应范例的"范例参数",它们也被称为参数化范例(parameterizedtype)或参量多态(parametricpolymorphism)。...

背景:我们都晓得泛型本质上是供应范例的"范例参数",它们也被称为参数化范例(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泛型


欢迎 发表评论: