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

我是一个程序员,如假包换。你看我连过年喝酒都想着 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>.
  • 如果操作与泛型类型无关,那么使用<?>

参考资料

  • 泛型:工作原理及其重要性
  • 能让你面试到崩溃的 interface 泛型及继承关系
  • 看看各大网友对Interface接口的理解的神回复

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

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

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/252792.html

(0)
上一篇 2022年5月4日
下一篇 2022年5月4日

相关推荐

发表回复

登录后才能评论