Java 类型擦除
程序员文章站
2022-05-28 14:33:52
...
概念
泛型是Java 1. 5版本才引进的概念,在这之前是没有泛型的,但是,泛型代码能够很好地和之前版本的代码兼容。那是因为,泛型信息只存在于代码编译阶段,在进入JVM之前,与泛型相关的信息会被擦除掉,我们称之为 - - 类型擦除。
无限制类型擦除
public class Erasure<T> {
private T key;
public T getKey() {
return key;
}
public void setKey(T key) {
this.key = key;
}
}
public class Test {
public static void main(String[] args) {
Erasure<Integer> era = new Erasure<>();
// 反射,获取Erasure类的字节码文件的Class类对象
Class<? extends Erasure> class1 = era.getClass();
// 获取所有的成员变量
Field[] declaredFields = class1.getDeclaredFields();
// 遍历数组,打印成员变量的名称和类型
for (Field f : declaredFields) {
System.out.println(f.getName() + ":" + f.getType().getSimpleName());
}
}
}
有限制类型擦除
public class Erasure<T extends Number> {
private T key;
public T getKey() {
return key;
}
public void setKey(T key) {
this.key = key;
}
}
public class Test {
public static void main(String[] args) {
Erasure<Integer> era = new Erasure<>();
// 反射,获取Erasure类的字节码文件的Class类对象
Class<? extends Erasure> class1 = era.getClass();
// 获取所有的成员变量
Field[] declaredFields = class1.getDeclaredFields();
// 遍历数组,打印成员变量的名称和类型
for (Field f : declaredFields) {
System.out.println(f.getName() + ":" + f.getType().getSimpleName());
}
}
}
擦除方法中类型定义的参数
public class Erasure<T extends Number> {
private T key;
public T getKey() {
return key;
}
public void setKey(T key) {
this.key = key;
}
// 泛型方法,上限为List
public <T extends List> T show(T t) {
return t;
}
}
Erasure<Integer> era = new Erasure<>();
// 反射,获取Erasure类的字节码文件的Class类对象
Class<? extends Erasure> class1 = era.getClass();
//擦除方法中类型定义的参数
// 获取Erasure下所有的方法
Method[] declaredMethods = class1.getDeclaredMethods();
for (Method m : declaredMethods) {
// 打印方法名和方法的返回值类型
System.out.println(m.getName() + ":" + m.getReturnType().getSimpleName());
}
桥接方法
/**
*
* 泛型接口
* @param <T>
*/
public interface Info<T> {
T info(T t);
}
public class InfoImpl implements Info<Integer> {
@Override
public Integer info(Integer value) {
return value;
}
}
/**
* 桥接方法
*/
Class<InfoImpl> infoClass = InfoImpl.class;
//获取所有方法
Method[] infoImplMethods = infoClass.getDeclaredMethods();
for (Method m : infoImplMethods) {
//打印方法名和方法的返回值类型
System.out.println(m.getName() + ":" + m.getReturnType().getSimpleName());
}
上一篇: 获取用户端的唯一标识
下一篇: Button按钮控件自绘操作