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


相关推荐

  • jdk api 1.6.0中文版_API2200中文版

    jdk api 1.6.0中文版_API2200中文版jdk

    2025年5月28日
    2
  • Ubuntu安装显卡驱动教程

    Ubuntu安装显卡驱动教程一 参考资料环境搭建 01 Ubuntu16 04 如何查看显卡信息及安装 NVDIA 显卡驱动二 环境配置系统 Ubuntu16 04 显卡 NVIDIAGeForc 4GB 三 准备工作 1 根据电脑显卡型号 下载对应显卡驱动下载链接 博主对应下载的驱动版本 NVIDIA Linux x86 64 470 57 02 run2 将显卡驱动放到 home yichao Downloads 目录四 关键步骤 1 查看显卡型号 驱动 查看显卡型号 ubuntu

    2025年6月17日
    3
  • Java 数组和List的使用「建议收藏」

    Java 数组和List的使用「建议收藏」Java中数据的保存离不开数组,但数组的长度是不可变的。这时候就需要列表类(List)来进行数组扩容等操作,同时列表还可以包含批量删除、修改等更方便的内容。同时ArrayList作为使用相当频繁的List类,它的扩容算法效率很高,本文通过其源代码来分析其扩容高效的原因。

    2022年8月23日
    5
  • stm32f103c6t6引脚图_74ls163引脚图及功能表

    stm32f103c6t6引脚图_74ls163引脚图及功能表今天准备画一个STM32F103C8T6的最小系统板,就去STM32F103C8的数据手册查看了一下相应的引脚,因为数据手册里面的引脚表有中容量的多种封装描述,看上去比较麻烦,我就单独做了一个LQFP48脚的引脚表。方便后期自己画封装,就图看的省力一点哈。其部分图片如下所示:有需要的朋友可以从我的资源里去下,资源链接:STM32F103C8T6详细引脚表本人水平有限,上述信息仅供学习参考,如有错误和不妥之处,请多多指教。另外创作不易,请勿抄袭,如果有帮助到大家的话希望大家可以点个赞,谢谢~…

    2022年9月25日
    5
  • [M枚举] lc5. 最长回文子串(枚举+中心拓展+区间dp)「建议收藏」

    [M枚举] lc5. 最长回文子串(枚举+中心拓展+区间dp)「建议收藏」文章目录1.题目来源2.题目解析方法一:枚举1.题目来源链接:lc5.最长回文子串2.题目解析方法一:枚举回文串一共有两种,即长度为奇数的回文串,长度为偶数的回文串。我们可以枚举回文串的中心(偶数长度回文串假想一个中心就行了),然后分别拿两个指针l=i-1,r=i+1向左右两边同时拓展,若s[l]=s[r]则,l–,r++。一直进行该操作,直到不等或一方到达边界位置。我们针对每一个枚举位置i,都考虑其两种情况,即偶数,奇数都考虑一遍,取个最大的就行了。

    2022年7月24日
    5
  • 清华毕业生开发新特效编程语言,99行代码实现《冰雪奇缘》,网友:大神碉堡!创世的快乐「建议收藏」

    清华毕业生开发新特效编程语言,99行代码实现《冰雪奇缘》,网友:大神碉堡!创世的快乐「建议收藏」只用99行代码,你也可以像《冰雪奇缘》里的艾莎公主一样拥有冰雪魔法。虽然你不能在现实世界中肆意变出魔法,但却能在计算机的虚拟世界挥洒特效。或许你不知道,电影和动画中特效有时仅仅短短的一秒,却可能需要高性能计算机演算一周,花费惊人。《冰雪奇缘》没有真人出演,预算却高达1.5亿美元,每一秒的镜头都是经费在燃烧。一般人想用电脑做出CG特效简直不可想象。然而,最近一位来自中国的MIT博…

    2022年5月9日
    47

发表回复

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

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