Java知识点拾遗3-类型信息和泛型

类型信息

Why

运行时类型信息可以使程序在运行时发现和使用类型信息,使得程序从只能在编译器执行面向类型的操作的禁锢中解脱出来

How

在Java中想要获取类型信息,有两种方式

  • 类字面常量。 编译期获得类型信息
  • 反射 。运行时获得类型信息
类字面常量

每个类都有一个Class对象,其类型信息就保存在这个对象中。可以使用Class.forName将某个类加载到JVM中,也可以使用类名.Class语法获得类型信息。在持有Class对象后,就可以调用很多内置方法来获得类型信息(略)。

Class cls = Class.forName("Example");
// forName语法如果类名输入错误,只会在运行时提醒
Class cls2 = Example.Class;
//Example.Class能在编译器保证类名正确

Instanceofclass.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实现泛型后,之前的类库都是没有泛型的,为了保证之前的类库后现在新的使用了泛型的程序能够愉快共处,那么就必须将程序中使用了泛型的证据擦除,这样程序就无法判别谁使用了泛型,谁没使用泛型,新旧程序就一视同仁,和谐共处了。

参数类型信息被擦出到泛型的第一边界

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值