欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java 类型擦除

程序员文章站 2022-05-28 14:33:52
...

概念

泛型是Java 1. 5版本才引进的概念,在这之前是没有泛型的,但是,泛型代码能够很好地和之前版本的代码兼容。那是因为,泛型信息只存在于代码编译阶段,在进入JVM之前,与泛型相关的信息会被擦除掉,我们称之为 - - 类型擦除。

无限制类型擦除

Java 类型擦除

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());
		}

	}
}

有限制类型擦除

Java 类型擦除

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());
		}

	}
}

擦除方法中类型定义的参数

Java 类型擦除

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());
		}

桥接方法

Java 类型擦除

/**
 * 
 * 泛型接口
 * @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());
		}
相关标签: java