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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 从零开始的大数据技术学习路线指南:带你轻松成为大数据开发工程师![通俗易懂]

    从零开始的大数据技术学习路线指南:带你轻松成为大数据开发工程师![通俗易懂]之前有不少小伙伴留言和私信我关于大数据学习路线,以及咨询我一些关于有工作经验想转行大数据的问题,只言片语也讲不清。我花了一个月整理了一份我当初学习的大数据学习路线,从最基础的大数据集群搭建开始,希望能帮助到大家。

    2022年5月23日
    39
  • wireshark tcpdump抓包(wireshark抓包arp解析)

    本文来自网易云社区当我们需要跟踪网络有关的信息时,经常会说“抓包”。这里抓包究竟是什么?抓到的包又能分析出什么?在本文中以TCP/IP协议为例,简单介绍TCP/IP协议以及如何通过wireshark抓包分析。Wireshark是最著名的网络通讯抓包分析工具。功能十分强大,可以截取各种网络封包,显示网络封包的详细信息。Wireshark下载安装,略。注意,若在Windows系统安装Wireshar…

    2022年4月18日
    53
  • hfe和HFE_hfe参数

    hfe和HFE_hfe参数Mako:我们已经学习了有关晶体管的工作原理,晶体管的放大作用就是由小的输入得到大的输出吧?Doc:这种说法还稍微有点欠缺,应该说成用小的输入控制大的输出更为合适。如果只关注晶体管的电流,就可以这样考

    2022年8月3日
    4
  • vue/uniapp 如何让页面的 onLoad 在 onLaunch 之后执行[通俗易懂]

    app.vue里的onLaunch中如果有异步方法(比如:登录),返回结果可能会在页面的onLoad之后,但onLoad中的方法需要登录回调的结果。为了让页面的onLoad在onLaunch之后执行,解决方案:1.main.js添加代码Vue.prototype.$onLaunched=newPromise(resolve=>{Vue.prototype.$isResolve=resolve;})2.在App.vue的onLau

    2022年4月14日
    54
  • 精灵图 详解

    精灵图 详解精灵图技术why?1.减少请求次数,提高界面加载速度what?图片拼合技术,它就是把多张小图合成一张大图,利用 背景定位属性background-position:xpxypx实现显示大图当中的某一个小图how?1.确定显示小图片的那个盒子的宽高2.以背景的方式插入精灵图background-image:url();3.移动图片的定位位置background-positi…

    2022年5月6日
    52
  • 神经网络知识点总结_经典神经网络

    神经网络知识点总结_经典神经网络本文基于文章,对神经网络的知识点做一个总结,可能不会对某些概念性的东西做详细介绍,因此需要对神经网络有基本的了解。FNN:前馈神经网络  神经网络的最基本也是最经典的形式,结果包括输入层,隐藏层和输出层,根据隐藏层的多少,分为shallownetwork和deepnetwork(deeplearning由此而来)Activationfunction  在神经网络的每

    2025年6月12日
    0

发表回复

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

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