Java知识点拾遗3-类型信息和泛型
2017-11-18 13:00
399 查看
类型信息
Why
运行时类型信息可以使程序在运行时发现和使用类型信息,使得程序从只能在编译器执行面向类型的操作的禁锢中解脱出来How
在Java中想要获取类型信息,有两种方式类字面常量。 编译期获得类型信息
反射 。运行时获得类型信息
类字面常量
每个类都有一个Class对象,其类型信息就保存在这个对象中。可以使用Class.forName将某个类加载到JVM中,也可以使用类名
.Class语法获得类型信息。在持有Class对象后,就可以调用很多内置方法来获得类型信息(略)。
Class cls = Class.forName("Example"); // forName语法如果类名输入错误,只会在运行时提醒 Class cls2 = Example.Class; //Example.Class能在编译器保证类名正确
Instanceof 和class.isInstance都可以用来判断一个对象是否是指定类的实例,但前者是“静态“,后者是“动态“的,例如
Example e = new Example(); e instanceof Example //输出true,此处只能比较类的命名Example,而类的命名无法用变量表示,这就是静态之处 Example.class.isInstance(e) //输出true,此处的Example.class可以替换成其他变量(Class类型的变量),这就是动态之处
反射
使用反射可以从.Class文件(字节码)中得知类型信息,可以突破访问修饰符的限制,访问私有域和私有方法
泛型
Why
要使代码能够应用于某种不具体的类型,而不是一个具体的类或者接口How
要使用泛型,可以从泛型类和泛型方法,泛型接口,几个方面入手,一般能使用泛型方法,就不使用泛型类,将泛型的语义范围压缩到最小,避免读者理解错误。Class Holder<A,B> {//泛型类, 类名后设置类型参数 public <A,B> void set(A a, B b)()//泛型方法,返回值前设置类型参数 }
由于泛型不是Java一开始就有的特性,Java在低层实现泛型的时候,使用的是擦除这个方法。
擦除
擦除是怎么回事?在泛型类内部,是无法获取到类型参数的类型信息的,也就是即使使用了Holder<Example,Example>, 在holder内部,也是无法获取到Example的类型信息,因为Java的泛型只会将类型参数的类型信息保存到编译期,在运行时,该类型信息就被擦除了,Example被擦除到类型Object
为什么要用擦除?迁移兼容性,由于泛型不是Java一开始就有的特性,在Java实现泛型后,之前的类库都是没有泛型的,为了保证之前的类库后现在新的使用了泛型的程序能够愉快共处,那么就必须将程序中使用了泛型的证据擦除,这样程序就无法判别谁使用了泛型,谁没使用泛型,新旧程序就一视同仁,和谐共处了。
参数类型信息被擦出到泛型的第一边界
相关文章推荐
- Java 类型信息 —— 获取泛型类型的类对象(.class)
- Java 类型信息知识点
- JAVA集合泛型,类型擦除,类型通配符上限之类的知识点
- 黑马程序员--Java基础加强--14.利用反射操作泛型III【解析关于泛型类型的细节信息的获取方法】【Method与泛型相关的方法】【个人总结】
- Java 5.0泛型编程之泛型类型(1)
- Java中动态代理(Java编程思想第14章--类型信息)整理
- java语法糖 泛型与类型擦除
- Java_web初学笔记之<泛型的目标类型推断>
- Java中的泛型和类型擦除
- Java使用反射来获取泛型信息
- java 泛型类型 E K N T V S U
- Java进阶(四)Java反射TypeToken解决泛型运行时类型擦除问题
- Java中定义的泛型字段到数据库中自动转换成了int类型字段 解决方案
- Java 的泛型擦除和运行时泛型信息获取
- Java——协变数组和类型擦除以及泛型相关知识
- Java编程思想之类型信息
- Java获得泛型类型
- JAVA编程思想学习总结:第十四章类型信息
- Java 泛型知识点
- [改善Java代码]强制声明泛型的实际类型