javaSE.类型擦除机制
泛型是如何实现的,程序编译之后的样子是什么样的?
一个泛型类型编译之后实际上会直接使用默认的类型👇
我们给类型变量设定了上界,那么从默认类型变成上界定义的类型👇👇👇
编译之后:👇
泛型仅仅在编译阶段进行类型检查,当程序在运行时,并不会真的去检查对应类型,所以哪怕我们不去指定类型也可以直接使用👇
使用的时原始上界Number👇
可以传入Number, 11.1👇
若是上界Object👇👇
默认为Object👇
可传入String👇
在指定类型时,编译才会进行检查👇否则就是默认原始类型👆
由于类型擦除,编译后的代码时进行了强制类型转换的👇
public static void main(String[] args) {A<String> a = new B();String i = a.test("10");
}👇编译之后public static void main(String[] args) {A a = new B();String i = (String) a.test("10");
}
为什么参数类型不同可以重写呢?👇
编译器帮助我们生成了一个桥接方法用于支持重写,类似于方法重载。
类型擦除机制其实就是为了方便使用后面的集合类(不然每次都要强制类型转换)同时为了向下兼容采取的方案。因此,泛型的使用会有一些限制。
首先,在进行类型判断时,不允许使用泛型,只能使用原始类型: