java 擦除,
背景:我们都知道泛型本质上是提供类型的‘类型参数’,也叫参数化类型或者参数多态。实际上,泛型的思想并不是由Java首先引入的,C中的模板就是使用泛型的一个例子。
(推荐视频:java视频教程)
GJ(Generic Java)是Java语言的扩展,是一种参数化类型的Java语言。用GJ编写的程序看起来基本上和普通的Java程序一样,除了参数化类型更多,类型转换更少。实际上,这些GJ程序是先转换成不含泛型的通用Java程序再进行处理,编译器自动完成从泛型Java到通用Java的翻译。
如何解决写爬虫IP受阻的问题?立即使用。
什么是真实的java泛型
我们都知道编译器会擦除泛型。编译器可以在编译源程序(带泛型的Java代码)时使用泛型类型信息来保证类型安全,验证大量如果没有泛型就不会被验证的类型安全约束,同时从生成的字节码中去掉这些类型信息。先验证一下:
公共静态void main(String[] args) {
ArrayListInteger ints=new ArrayListInteger();
ints . add(1);
ints . add(2);
int . add(3);
ArrayList string STS=new ArrayList string();
STS . add( a );
STS . add( b );
STS . add( c );
system . out . println(ints . getclass()==STS . getclass());
}上面打印的结果是真的,因为
按照理解,泛型被擦除后,原来的类型就检索不到了,都是对象的形式。这是真的吗?
看一下下面的代码:
导入Java . lang . reflect . parameterized type;导入Java . util . ArrayList;导入Java . util . list;公共类ClassTest {
公共静态void main(String[] args)引发异常{
ParameterizedType类型=(ParameterizedType)
bar . class . getgenericsuperclass();
system . out . println(type . getactualtypearguments()[0]);
ParameterizedType字段类型=(ParameterizedType)
Foo.class.getField(children )。getGenericType();
system . out . println(field type . getactualtypearguments()[0]);
parameterized type param type=(parameterized type)
Foo.class.getMethod(foo ,List.class)。getGenericParameterTypes()[0];
system . out . println(param type . getactualtypearguments()[0]);
system . out . println(foo . class . gettype parameters()[0]。get bounds()[0]);
}
FooE类扩展CharSequence {
public list bar children=new ArrayList bar();
public ListStringBuilder foo(ListString foo){ return null;}
公共void栏(列表?扩展字符串参数){}
}
类栏扩展FooString {}
}打印出来
班级。郎。字符串类com。Java拼图。大卫王。ClassTest $ Barclass Java。郎。字符串接口Java。郎。Charsequence你会发现每个类型参数都是保留的,可以在运行时通过反射机制获取。那么到底什么是“类型擦除”呢?至少有些东西被抹去了,对吧?是的,事实上,除了结构化信息之外的所有内容都被删除了。这里,结构化信息指的是与类结构相关的信息,而不是程序执行过程。换句话说,与类的类型参数及其字段和方法相关的元数据将被保留,并可以通过反射获得。
本文来自我们,java教程专栏,欢迎学习!上面的java类型擦除真的能够完全擦除所有信息吗?更多详情请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。