类型擦除(泛型擦除)

1.概念

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

2.分类:

  • 无限制类型擦除

img

代码演示:

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
  • 有限制类型擦除

img

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
  • 擦除方法中类型定义的参数

img

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
  • 桥接方法

img

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

posted on   ~码铃薯~  阅读(257)  评论(0编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· 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框架,返回到前一个页面,并且刷新前一个页面

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示