- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java 中一个天天都在被人使用,但你并不知道为什么的知识点由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
泛型作为 Java 中一个天天都在被人使用的特性,你真的知道它的原理吗?
首先我们说下什么是泛型.
泛型,就是泛化类型也就是泛化参数类型。平时我们在编写代码的时候,方法的参数在定义的时候都是指定特定的类型,比如 Integer,Double 或者其他自己编写的类。那么泛化类型就是,我们在编写一个方法的时候对于参数的类型不具体指定,而是定义一个通用类型,在使用的时候根据类型自动转化.
上面的描述可能比较抽象,我们再看一下,如果没有泛型的话,会出现什么情况以及为什么说这个泛型大家天天都在使用.
我们都知道 ArrayList 作为 Java 中一个很频繁被使用的集合,它是一个可变长的数组,底层是基于 Object[] 来实现的.
可以简单理解为下面的内容 。
如果说这个时候我们使用上面的 ArrayList 去存储 String 类型的话,需要如下操作,在使用的时候必须进行手动强转.
首先看到上面的代码,大家一定会诧异,要是每次使用的时候都这样显示强转的话,那不是要命了么,而且这还是使用者知道是什么类型的情况才能进行手动强转,如果说根本不知道是什么类型的时候,根据没办法进行强转,这种方式简直不能忍,还特别容易出错.
那怎么解决这个问题呢?有朋友说我们可以对于不同的类型实现一个自己的 ArrayList 类,这样在使用的时候就可以不用强转了啊。对此阿粉只能说,对于 JDK 提供的类可以这样做,但是对于用户自己编写的类怎么实现呢?
这个时候大家可能会说到,ArrayList 我天天使用,也没手动强转过啊,不还是用的好好的.
这就要归功于我们今天所说的主角,泛型了.
我们给 ArrayList 增加的泛型,通过定义一个泛化的类型,当我们在使用的时候如果传递的类型不是指定的类型,那么在编译的阶段就会报错,从而也就不会有需要强转的操作了.
这样修改过后,我们在编写代码的时候就可以如果进行 。
当我们需要使用 Integer 对象的时候就可以使用下面这种方式 。
另外我们还知道 ArrayList 实现了 List 接口,如下所示,所以会有一种向上转型的概念,就是我们前面在定义的时候使用 List 也是可以,也就是我们通常的定义方式,即 List list = new ArrayList<>(),
但是这里我们需要注意不可以进行如下的泛型向上转型,比如下面这个例子.
我们定义了 Person 类,Man 类以及 Women 类 。
我们在使用的时候只能这样 。
不可以 。
因为我们不能同时在一个List 中即加入 man 也加入 woman,这样是不行的.
接下来我们再看另一个问题,假设我们有一个方法,是打印 PersonList 内容的,如下所示:
上面的内容会编译出错,效果是这样的.
原因是因为虽然 Man 类是继承了 Person 类,但是 ArrayList 并没有继承ArrayList 类,所以这个方法是编译通不过。看到这里小伙伴又惊呆了,这不行啊,总不能引入了泛型,就不支持多态了吧,所以这个要怎么办.
这里我们就需要引入另一个东西了,那就是泛型里面的 extends,我们把 print 方法换个写法,这个时候就不会编译不通过了。如下所示图片 。
extends 表示传进来的参数只要是 Person 的子类都可以,这样就还支持多态了。所以现在小伙伴知道了为什么JDK 源码以及很多框架的源码中都有很多? extends xxx 这种形式的代码了吧.
原文链接:https://mp.weixin.qq.com/s/IiTjOT-NehD33vJKiKxEZQ 。
最后此篇关于Java 中一个天天都在被人使用,但你并不知道为什么的知识点的文章就讲到这里了,如果你想了解更多关于Java 中一个天天都在被人使用,但你并不知道为什么的知识点的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
一文讲清动态规划的本质 动态规划 Dynamic Programming (DP) 是算法领域的核心思想之一,却同时也是让许多学习者感到棘手的难点之一。动态规划的难点在于它不是简单的数学推导,也不单
两三个星期没有发布新文章了,今天再来讲一个新的数据结构:图。 何为图论 见名知意,图论 (Graph Theory) 就是研究 图 (Graph) 的数学理论和方法。图是一种抽象的数据结
前言:这又是一篇关于数据结构的文章。 今天来讲一下线段树和线段树的基本应用。线段树 (Segment Tree),是一种非常高效且高级的数据结构,其主要用于区间查询和与区间更新相关的问题,
前几天谈论了许多关于数论和数据结构的东西,这些内容可能对初学者而言比较晦涩难懂(毕竟是属于初高等算法/数据结构的范畴了)。今天打算来讲一些简单的内容 - STL 标准模板库。 STL 标准
以下内容来源于于我开源的 JavaGuide (Java学习&&面试指南,Github 130k star,370人共同参与爱完善), 万字总结,质量有保障! 这
恶意软件是病毒、蠕虫、特洛伊木马以及其他有害计算机程序的总称,并且很早就一直存在。而恶意软件随着时间的失衡不断发展演变,黑客利用它来进行破坏并获取敏感信息。而阻止和打击恶意软件占据了信息安全专业人
我是一名优秀的程序员,十分优秀!