Java 泛型很简单,别搞那么复杂,顺带吐槽 Kotlin

794 阅读1分钟

Java 的泛型,从我很久之前看《Java 编程思想》就想吐槽了,明明很简单的一件事,怎么搞得那么复杂?还弄个公式让别人记,什么上界下界的,不觉得更难理解了吗?

泛型很简单,记住一句话就行:父类引用才能指向子类对象。

为什么 <T extends Fruit> 只能用于返回值,不能用于参数?因为返回值是一个值(子类对象),而 T 是 Fruit 的子类,那么Fruit f = t才是符合语法的,反之则不符合。

为什么 <T super Fruit> 只能用于参数,不能用于返回值?因为 T 是参数类型,而 T 作为 Fruit 的父类,那么 T t = new Fruit()才是符合语法的,反之则不符合。

集合 List 等场景也是类似的道理,就不多说了。

刚刚看一篇技术文章,说 Kotlin 的 in、out 关键字更清晰,更好理解,忍不住了,平时虽然挺喜欢用 Kotlin,但 in、out 绝对是我最反感的两个关键字!

in、out 的命名只是部分反映了用法,但丢了语义,可以说是捡了芝麻,丢了西瓜。相比  Java 的 extends/super,根本就是退化。

还有协变/逆变这两个翻译也不太行,从单词上看,in 不是更像协变吗?怎么就是逆变了?当然,如果要和 Java 的关键字做对比,那么协变作为 extends 的翻译,的确是更匹配的。

写代码那么久,最反感的就是要记顺序的代码,很容易弄混。因此一直不喜欢上界、下界、in、out、协变、逆变,这些说法。

不吐不快,借地方吐槽一下,见谅。