本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
我是一个程序员,如假包换。你看我连过年喝酒都想着 Java!
听说喝酒都想着 Java 的程序员不是一个好程序员!那我就给大家证明一下,我对泛型的理解有没有“掺酒”。
什么是泛型?
这个网上有很对定义,但是都不好理解。简单的来说,就是“类型参数化”,或者说是“参数化类型”。
就是说这个类型,我在撸代码的时候,并不能确定。就把这个类型给参数化,这样就相当于你“传递给它一个什么参数,它就是什么类型”!
这句话有点夸张,描述不是特别恰当和准确。那就看我喝酒的时候想到的。
比如,这个酒杯,它在生产的时候,并不知道我将来用来喝酒,还是喝饮料,喝白开水,喝茶都有可能。而且就是用来装酒,我也能用来装白酒、啤酒、红酒、黄酒等酒。
在比如,我们的肚子,生下来的时候并不知道,我们能吃什么不能吃什么。只有在你用来吃,装东西的时候。才知道,这个肚子能装酒,那个肚子能装肉。
这就是泛型,生产制造的时候,我们并不知道将来会用来装什么?只有调用者明确。
那么一句话来总结一下:泛型其实就是在定义类、接口、方法的时候不局限地指定某一种特定类型,而让类、接口、方法的调用者来决定具体使用哪一种类型的参数。
泛型的使用场景有哪些?
这也是一个问题,很多人理解泛型。但是你问他,Java 中泛型除了集合:Map、List、Set 等,平时工作中还有哪些地方适合用泛型?
你回答:“JDK 集合,Future<T>,WeakReference<T>,Class<T>”等。
你要这样回答,我真不满意!我想问的是,哪些场景需要用到泛型,而不是哪些地方使用的是泛型?这是两个问题。
那么到底有哪些场景适合呢?我简单列举了一下。
- 约束对象类型的场景,定义边界(T extends …)的地方。
- 用户希望返回他自定义类型的返回值场景,比如 Json 转 Java Bean。
- 在用反射的应用中,也经常会用到泛型,如 Class<T>。
其他的,关于类型擦除、泛型通配符、有界类型等我就不写说了,具体可以参考我的这篇文章《能让你面试到崩溃的 interface 泛型及继承关系》。
最后说一下,泛型的 PECS 原则。the producing list 使用 extends,简称:PE;而 the consuming list 使用 super,简称:CS。这就是 PECS 原则。
简单说,就是下面 4 句话!
- 只用于“读”功能时,泛型结构使用<? extends T>
- 只用于“写”功能时,泛型结构使用<? super T>
- 如果既用于“写”,又用于“读”操作,那么直接使用<T>.
- 如果操作与泛型类型无关,那么使用<?>
参考资料
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » 从过年喝酒中,我重新领悟到了 Java 中的泛型!