字节面试被问到了Java泛型原理,我是这么回答的...



泛型原理

在没有泛型的时代,如果我们可能会写出如下代码

public class Main {


    public static void main(String[] args) {
        ArrayList list = new ArrayList();

        list.add(1);
        list.add("Code");

        System.out.println(list);
    }

}

这段代码编译运行都可以,但是这段代码的问题也很明显,ArrayList可以接收任何类型的数据,而且获取值时需要进行强制类型转换。

为了确保这些编译出来的Class文件可以在引入泛型之后可以继续运行,那么Java泛型引入了 类型擦除的概念。


如下面这段代码

编译前

public class Main {


    public static void main(String[] args) {
        ArrayList<Integer> integers = new ArrayList<>();
        ArrayList<String> list = new ArrayList<>();

        integers.add(1);
        list.add("2");

        System.out.println(list.get(0));

        HashMap<String, String> map = new HashMap<>();
        map.put("hello","world");

        System.out.println(map.get("hello"));
    }

}

编译后

public class Main {
    public Main() {
    }

    public static void main(String[] var0) {
        ArrayList var1 = new ArrayList();
        ArrayList var2 = new ArrayList();
        var1.add(1);
        var2.add("2");
        System.out.println((String)var2.get(0));
        HashMap var3 = new HashMap();
        var3.put("hello", "world");
        System.out.println((String)var3.get("hello"));
    }
}

对比

  • ArrayList<Integer> ——> ArrayList
  • ArrayList<String> ——> ArrayList
  • HashMap<String,String> ——> HashMap

编译后 <>没有了,或者说他们都变成了 “裸类型(Raw type)” ,裸类型可以被视为所有类型泛型化实例的共同父类型。这其实就是 类型擦除

而且,因为类型都变为了裸类型,所以 只有在元素访问时,加入了从 Object类型到 String类型的强制类型转换. 因为




怎么回答?

Java泛型原理其实是使用到了【类型擦除】这个方法,比如说我们平常使用到的 ArrayList或者HashMap,在使用的时候,都会去为其定义类型,那么在类型擦除这个机制下,Java代码编译后这些类型都消失了,或者说变成了 “裸类型”,这个裸类型可以理解为所有类型泛型化实例的共同父类型,使用这样的机制还有一个重要的目的就是为了让 Java5之前编译出来的Class文件在引入泛型后可以继续使用。




泛型相关面试题



为什么引入泛型?使用泛型的好处有哪些?

因为在没有泛型的时代,我们使用的List 容器没有指定存储数据类型,这种情况下,可以向 List 添加任意类型数据,编译器不会做类型检查,而是默默的将所有数据都转为 Object。

假设,最初我们希望向 List 存储的是整型数据,但是不小心存入了其他类型的数据,所以当需要从容器中取整型数据时,由于 List 当成 Object 类型来存储,不得不使用类型强制转换。在运行时,因为List 中数据类型不一致的,可能为程序运行带来一些风险。


好处

  1. 提供了编译期的类型安全,确保你只能把正确类型的对象放入集合中
  2. 避免了类型转换


List<? extends T>和List <? super T>之间有什么区别 ?


答:List<? extends T>可以接受任何继承自T的类型的List,而List<? super T>可以接受任何T的父类构成的List。



除了类型擦除就没别的方法了吗?

当然不是,我们还可以保持已有不变,在平行增加一套泛型机制,就比如 HashTable 和 HashMap,或者 Vector 和 ArrayList。




最后

我是 Code皮皮虾,一个热爱分享知识的 皮皮虾爱好者,未来的日子里会不断更新出对大家有益的博文,期待大家的关注!!!

创作不易,如果这篇博文对各位有帮助,希望各位小伙伴可以一键三连哦!,感谢支持,我们下次再见~~~

分享大纲

大厂面试题专栏


Java从入门到入坟学习路线目录索引


开源爬虫实例教程目录索引

更多精彩内容分享,请点击 Hello World (●’◡’●)


在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值