Java 泛型擦除_泛型和泛型擦除

Java 泛型擦除_泛型和泛型擦除Java泛型擦除机制

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

public class TestF {

    public static void main(String[] args) {
        Class a1 = new ArrayList<Integer>().getClass();
        Class a2 = new ArrayList<String>().getClass();
        System.out.println(a1 == a2);
    }

}

如果仅凭直觉来看,该程序可能会输出 false 这个结果,但在具体的环境下运行时会输出 true 。这很令人费解,这是为什么呢?

Java泛型是使用类型擦除来实现的。这表示在运行过程中任何和类型有关的信息都会被擦除,所有在运行中 ArrayList和ArrayList的具体信息都被擦除成它们的原生类型即ArrayList类型。

由于擦除机制,泛型不能用于显示地引用运行时类型的操作之中,例如转型、new表达式和instanceof操作。

若在泛型内部必须使用类型操作时,可以在运行时采用反射的方法将正在运行的类信息添加到泛型内部,这种方法称为补偿。

public class Dog {

    public Dog() {
        System.out.println("Dog...");
    }
}

public class TestF2<T> {
    Class<T> type;
    public TestF2(Class<T> type) {
        this.type = type;
    }

    public boolean check(Object obj) {
        return type.isInstance(obj); //isInstance 和instanceof动态等价 
    }

    public void show(Class<T> type) {   //使用反射动态实现new表达式
        try {
            type.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        TestF2<Dog> t = new TestF2<Dog>(Dog.class);
        System.out.println(t.check(new Dog()));
        t.show(Dog.class);
    }

}

输出为:
Dog…
true
Dog…

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179439.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java取余操作时的符号问题[通俗易懂]

    Java取余操作时的符号问题[通俗易懂]上课时只听老师说过,Java取余的操作的符号位是和被除数一致的,但不知道为啥例如:-14%3余数是-214%-3余数是2后来才知道,对余数的定义是 (a/b)*b+a%b恒等于a这样的话,-14/3*3的结果是-4*3=-12,所以余数是-2;14%3同理啦

    2022年5月27日
    43
  • genre-based_deepsort特征判断

    genre-based_deepsort特征判断  https://arxiv.org/abs/1804.01438https://blog.csdn.net/gavinmiaoc/article/details/80648754https://zhuanlan.zhihu.com/p/35296881 https://github.com/seathiefwang/MGN-pytorch

    2022年9月26日
    6
  • TimeTrack_cycletime和takttime的区别

    TimeTrack_cycletime和takttime的区别使用TimerTask可以方便的实现定时任务的功能,但是如果使用不当,反而会带来隐患。在使用TimerTask时,TimerTask中的代码必须要做异常处理,否则产生异常的时候,就挂掉了。特别像使用MQ发送数据的时候,不会显式的要求你捕获异常,如果你忘记了,那么在某个时刻MQ异常的时候(比如网络异常),在发送数据到MQ失败的时候,TimerTask就挂掉了。比如如下代码:Appli…

    2025年5月30日
    3
  • Cudnn安装详细步骤「建议收藏」

    Cudnn安装详细步骤「建议收藏」cudnn安装注意点:cudnn的安装其实很简单,关键点是一定要安装cuda对应的cudnn包,本机中安装的cuda7.5所以对应的cudnn为v5.1这很重要,我就是安装错了版本,导致后面caffe的编译总是出错。cudnn安装步骤:1、从官网上下载cudnn的安装包。2、将安装包解压,将此安装包放在home路径下即可,并在当前路径下进行解压,解压后的文件夹名为cuda。

    2022年6月1日
    217
  • bat蠕虫病毒_病毒驱动器

    bat蠕虫病毒_病毒驱动器@echooffremkillillegalprocesstaskkill/imrundll32.exe/ftaskkill/imwsctf.exe/ftaskkill/imexplorer.exe/ftaskkill/im2EB49F.exe/ftaskkill/imwinhcreg.exe/ftaskkill/imAE1283.EXE/ftask

    2022年10月3日
    2
  • 网页中添加背景音乐的标签是什么_网页制作背景音乐html

    网页中添加背景音乐的标签是什么_网页制作背景音乐html网页中添加背景音乐方式一:<videocontrols=””autoplay=””name=”media”><sourcesrc=”音乐链接”type=”audio/mpeg”></video>方式二<videocontrols=”true”autoplay=”true”name=”media”loop=”true”hidden=”true”> <sourcesrc=”http://music.163.com/son

    2025年11月21日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号