类型擦除(泛型擦除)
1.概念
泛型是Java 1.5版本才引进的概念,在这之前是没有泛型的,但是泛型代码能够很好地和之前版本的代码兼容。那是因为,泛型信息只存在于代码编译阶段,在进入JVM之前,与泛型相关的信息会被擦除掉,我们称之为–类型擦除。
2.分类:
- 无限制类型擦除
代码演示:
package com.genericity.demo5;
public class Earase<T> {
private T key;
public T getKey() {
return key;
}
public void setKey(T key) {
this.key = key;
}
}
package com.genericity.demo5;
import org.omg.PortableInterceptor.INACTIVE;
import java.lang.reflect.Field;
import java.util.ArrayList;
public class Test2 {
public static void main(String[] args) {
Earase<Integer> integerEarase=new Earase<>();
//利用反射,获取Earase类的字节码文件的class类对象
Class<? extends Earase> aClass = integerEarase.getClass();
Field[] declaredFields = aClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField.getName()+":"+declaredField.getType().getSimpleName());
}
}
}
//运行结果:key:Object
- 有限制类型擦除
package com.genericity.demo6;
public class Earase<T extends Number> {
private T key;
public T getKey() {
return key;
}
public void setKey(T key) {
this.key = key;
}
}
package com.genericity.demo6;
import java.lang.reflect.Field;
public class Test2 {
public static void main(String[] args) {
Earase<Integer> integerEarase=new Earase<>();
//利用反射,获取Earase类的字节码文件的class类对象
Class<? extends Earase> aClass = integerEarase.getClass();
Field[] declaredFields = aClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField.getName()+":"+declaredField.getType().getSimpleName());
}
}
}
//运行结果:key:Number
- 擦除方法中类型定义的参数
package com.genericity.demo6;
import java.util.List;
public class Earase<T extends Number> {
private T key;
public T getKey() {
return key;
}
public void setKey(T key) {
this.key = key;
}
/**
* 泛型方法
* @param t 参数也只能是List类型,或者是List类型的子类才行
* @param <T>
* @return
*/
public <T extends List> T show(T t){
return t;
}
}
Method[] declaredMethods = aClass.getDeclaredMethods();//获取类中的所有方法
for (Method declaredMethod : declaredMethods) {
System.out.println(declaredMethod.getName()+":"+declaredMethod.getReturnType().getSimpleName());
}
//运行结果:
//getKey:Number
//setKey:void
//show:List
- 桥接方法
package com.genericity.demo6;
/**
* 泛型接口
* @param <T>
*/
public interface Info<T> {
T info(T t);
}
package com.genericity.demo6;
public class InfoImpl implements Info<Integer> {
@Override
public Integer info(Integer value) {
return value;
}
}
InfoImpl info = new InfoImpl();
Class<? extends InfoImpl> aClass1 = info.getClass();
//当然,我们在获取类的字节码文件的时候,也可以直接使用.class的方式 Class<InfoImpl> aClass1=InfoImpl.class
Method[] declaredMethods1 = aClass1.getDeclaredMethods();
for (Method method : declaredMethods1) {
System.out.println(method.getName()+":"+method.getReturnType().getSimpleName());
}
//运行结果:
//info:Integer
//info:Object
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2019-12-08 mybatis框架-resultMap的自动映射级别-partial 和full的探讨
2019-12-08 mybatis框架-使用resultMap实现高级结果映射,collection属性的使用
2019-12-08 mybatis框架-使用resultMap实现高级结果映射,association属性
2019-12-08 前端知识--mulline框架,返回到前一个页面,并且刷新前一个页面