Java 泛型课程让我了解到协变和逆变概念。这让我感到头痛,因为我找不到一个非常简单的演示它是什么的方法。
我已经阅读了几个stackoverflow上类似的问题,但我发现它们对于一个Java学习者来说太难理解了。实际上,泛型的解释需要理解协变和逆变,而协变和逆变的概念则依赖于对泛型的理解进行演示。
我曾经有一些希望在这里阅读,但最后我和C. R.有同样的感觉:
这个标题让我想起了学习广义相对论的日子。 - C.R. Dec 22 '13 at 7:34
有四个理论问题让我感到非常困惑,我找不到好的简单解释。以下是它们,以及我目前的部分理解(我担心专家们会对此感到很有趣)。
欢迎您帮助我纠正和澄清(请记住这是为初学者而不是专家准备的)。
这种理解是否存在问题?
- 什么是程序设计中的不变性/协变性/逆变性? 我最好的猜测是:
- 方差与Java方法有何关系? 我最好的猜测是,给定两个类A和D,其中A是D的祖先,并且具有一个重载/覆盖方法f(arg):
- 如果两种方法中参数类型之间的关系与两个类之间的关系相同,则方法中的参数类型被称为与类类型协变,否则:A和D类之间的参数类型继承与A和D类之间的继承相协变。
- 如果参数之间的关系反转了类之间的关系,则参数类型被称为逆变于类类型,否则:A和D类之间的参数类型继承与A和D类之间的继承相逆变。
- 为什么理解方差对Java程序员很重要? 我的猜测是:
- Java语言创建者已经在语言中实现了方差规则,并且这对程序员可以做什么有影响。
- 一条规则规定覆盖/重载方法的返回类型必须逆变于继承。
- 另一条规则规定覆盖/重载的参数类型必须与继承相协变。
- Java编译器检查方差规则是否有效,并相应地提供错误或警告。使用方差知识更容易解密消息。
- 覆盖和重载的区别是什么? 最好的猜测:
- 当参数和返回类型都是不变时,一个方法覆盖另一个方法。所有其他情况都被编译器视为重载。