张小飞的Java之路——第三十四章——泛型

写在前面:

视频是什么东西,有看文档精彩吗?

视频是什么东西,有看文档速度快吗?

视频是什么东西,有看文档效率高吗?


问题

张小飞:虽然用集合存储数据很方便,但是每次取出来都是 Object 类型的,还得转换类型,很麻烦啊

public static void main(String[] args) throws Exception {
    ArrayList list = new ArrayList();
    //可以添加不同类型的数据
    list.add(123);//123会自动装箱成Integer
    list.add("456");

    for (int i = 0; i < list.size(); i++) {
        //每次从集合中取出来的都是 Object 类型的对象
        Object o = list.get(i);
        System.out.println(o);
    }
}

诸小亮:这是因为我们在定义集合的时候没有限制元素的类型,所以不同类型的数据都可以添加进去
导致取出来的数据类型可能不一致,为了避免错误,所以都返回 Object 类型

张小飞:还可以限制存储的元素类型?

诸小亮:是的,Java推荐在定义集合的时候就限制元素的类型

张小飞:应该怎么做呢?

诸小亮:很简单,只需要在定义集合的时候在后面加上尖括号,并指定元素的类型就行了。
比如,如果我们想要定义一个只能存储 String 的的 ArrayList,就可以这样写:

image.png

诸小亮:在使用 get 方法时,就不用强制类型转换了
image.png
张小飞:嗯,这样确实不错,不过,就是不存存储其他类型的数据了

诸小亮:你说的不错,但是它的好处也是很多的

首先在编译时期就限制了集合中元素的类型,避免了数据杂乱,提高了程序的健壮性;

其次,取出来的元素都是我们指定的类型,可以直接使用,不需要再进行类型转换,更加方便快捷

泛型介绍

张小飞:所有的集合类,List、Set等,它们都支持限定元素类型吗?

诸小亮:是的,其根本原因是,Collection 接口支持泛型

image.png
张小飞:泛型?这是什么东西?

诸小亮:上图中的 E 就是 **泛型,**可以把它当成参数类型

张小飞:不懂,能否在详细一点儿?

诸小亮:就是表示,该类的对象只能操作 **E **类型的数据

张小飞:那,E 类型具体是什么类型呢?String、Integer、Double还是Long

诸小亮:具体是什么类型,在创建对象时候由我们自己指定,比如:

image.png

泛型:泛指一些类型(不具体),需要自己指定具体是哪种类型

集合框架中的泛型

诸小亮:来,我们看看集合框架中具体是怎么使用泛型的

迭代器

诸小亮:首先是迭代器,之前我们用 Iterator 取出来的都是 Object 类型

张小飞:现在也是啊,就算我用了泛型,返回的还是 Object 类型

image.png

诸小亮:这是因为你没有给 Iterator 指定泛型

image.png

张小飞:原来如此,我再改改

30秒后。

张小飞:现在没有问题了,取出来的直接是指定的类型

image.png

Comparable

张小飞:我们之前实现 Comparable 后, compareTo 方法的参数都是Object,是不是也能用泛型?

image.png

诸小亮:是的,Comparable 也定义了泛型

image.png
image.png

张小飞:那,具体应该怎么用?

诸小亮:在实现 Comparable 时,指定具体的类型,比如:

image.png

张小飞:原来是这样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值