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…

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • React—最简洁的技术学习(一)

    React—最简洁的技术学习(一)React—最简洁的技术学习(一)

  • 安装vmware一直报缺少dll_vmware安装问题

    安装vmware一直报缺少dll_vmware安装问题MicrosoftRuntimeDLL安装程序未能完成安装不要说什么去打开%temp%,治标不治本,如果后面无法输入密钥的话,两个问题堆在一起根本解决不了。MicrosoftRuntimeDLL安装程序未能完成安装:这个问题的最直接解决办法是服务没打开,打开控制面板-管理工具-服务确认以下两个服务是打开的:WindowsInstaller;WindowsModulesInst…

  • vue如何生成二维码_vue实现扫描二维码

    vue如何生成二维码_vue实现扫描二维码这里介绍两种vue生成二维码的方法QRcodevue-qrvue-qr比QRcode功能多在可以在中间加logo下面先介绍QRcodevue里安装qrcodejs的npm包npminstallqrcodejs2importQRCodefrom‘qrcodejs2’methods:{creatQrCode(){varqrcode=newQRCode(t…

  • python 函数进阶与闭包

    函数的命名空间和作用域引言现在有个问题,函数里面的变量,在函数外面能直接引用么?上面为什么会报错呢?现在我们来分析一下python内部的原理是怎么样:我们首先回忆一下Python代码运行的时候

  • 一些模板代码

    一些模板代码jdbc模板代码nio读写模板代码publicclassNewBufferTest{publicstaticvoidmain(String[]args)throwsIOExce

  • jquery的delegate实现原理[通俗易懂]

    jquery的delegate实现原理[通俗易懂]//对标签绑定点击事件但是该方法对动态生成的元素无法生效$(‘.btn’).bind(‘click’,function(){alert(‘点击了’);})//jquery处理$(‘document’).delegate(‘.btn’,’click’,function(){alert(‘点击了’);});//其实原理就是利用了J

发表回复

您的电子邮箱地址不会被公开。

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