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、协变、逆变,这些说法。
不吐不快,借地方吐槽一下,见谅。