栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Java泛型】类型擦除

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Java泛型】类型擦除

1.概念

泛型的代码只存在于编译阶段,在进入JVM之前,与泛型相关的信息会被擦除掉,我们称之为类型擦除

2.示例

(1)无限制类型擦除

public class Erasure {

    private T key;

    public T getKey() {
        return key;
    }

    public void setKey(T key) {
        this.key = key;
    }
}

import java.lang.reflect.Field;

public class Demo {
    public static void main(String[] args) {

        Erasure erasure = new Erasure<>();
        // 利用反射获取类的字节码文件的Class类对象
        Class  clz = erasure.getClass();
        // 获取所有的成员变量
        Field[] declaredFields = clz.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            // 打印成员变量的名称和类型
            System.out.println(declaredField.getName() + ":" + declaredField.getType().getSimpleName()); // key:Object

        }

    }


}

 (2)有限制类型擦除

public class Erasure {

    private T key;

    public T getKey() {
        return key;
    }

    public void setKey(T key) {
        this.key = key;
    }
}
import java.lang.reflect.Field;

public class Demo {
    public static void main(String[] args) {

        Erasure erasure = new Erasure<>();
        // 利用反射获取类的字节码文件的Class类对象
        Class  clz = erasure.getClass();
        // 获取所有的成员变量
        Field[] declaredFields = clz.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            // 打印成员变量的名称和类型
            System.out.println(declaredField.getName() + ":" + declaredField.getType().getSimpleName()); // key:Number

        }

    }


}

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

import java.util.List;

public class Erasure {

    private T key;

    public T getKey() {
        return key;
    }

    public void setKey(T key) {
        this.key = key;
    }

    
    public  T show(T t) {
        return t;
    }
}

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Demo {
    public static void main(String[] args) {

        Erasure erasure = new Erasure<>();
        // 利用反射获取类的字节码文件的Class类对象
        Class  clz = erasure.getClass();
        // 获取所有的成员变量
        Field[] declaredFields = clz.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            // 打印成员变量的名称和类型
            System.out.println(declaredField.getName() + ":" + declaredField.getType().getSimpleName()); // key:Number

        }


        System.out.println("---------------------------------------------------");

        // 获取所有的方法
        Method[] declaredMethods = clz.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            // 打印方法名和返回值类型
            System.out.println(declaredMethod.getName() + ":" + declaredMethod.getReturnType().getSimpleName());
        }
        

    }


}

(4)桥接方法

 

public interface Info {
    T info(T t);
}
public class InfoImpl implements Info{
    @Override
    public Integer info(Integer value) {
        return value;
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/711102.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号