从过年喝酒中,我重新领悟到了 Java 中的泛型!

业余杂谈 herman 246浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

我是一个程序员,如假包换。你看我连过年喝酒都想着 Java!

喝酒都想着 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)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 从过年喝酒中,我重新领悟到了 Java 中的泛型!