min*_*ins 6 java generics inheritance covariance contravariance
关于泛型的 Java 课程正在引导我出现方差概念.这让我有些头疼,因为我无法找到它的简单演示.
我已经在stackoverflow上阅读了几个类似的问题,但我发现它们对于Java学习者来说太难理解了.实际上问题在于对泛型的解释需要理解方差,并且证明了方差的概念在很大程度上依赖于泛型理解.
这个标题让我想起了学习广义相对论的日子. - CR 13年12月22日7:34
四个理论问题让我很困惑,我找不到好的和简单的解释.在这里他们是,我目前的部分理解(我担心专家将非常有乐趣阅读这个).
欢迎您提供纠正和澄清的帮助(请记住,这适用于初学者,而不是专家).
这不是特定于OO,而是与某些类型的属性有关。
例如,使用函数类型
A -> B // functional notation
public B meth(A arg) // how this looks in Java
Run Code Online (Sandbox Code Playgroud)
我们有以下内容:
令C为A的子类型,D为B的子类型。
B b = meth(new C()); // B >= B, C < A
Object o = meth(new C()); // Object > B, C < A
Run Code Online (Sandbox Code Playgroud)
但以下操作无效:
D d = meth(new A()); // because D < B
B b = meth(new Object()); // because Object > A
Run Code Online (Sandbox Code Playgroud)
因此,要检查meth的调用是否有效,我们必须检查
这是众所周知的和直观的。按照惯例,我们说一个函数的返回类型是协变和方法的参数类型是逆变的。
对于像List这样的参数化类型,我们认为参数类型在Java等具有可变性的语言中是不变的。我们不能说C的列表就是A的列表,因为如果是这样,我们可以将A存储在C的列表中,这令调用者感到惊讶,后者仅假定列表中的C。但是,在Haskell这样的值是不可变的语言中,这不是问题。因为我们传递给函数的数据不能被突变,所以如果C 是 A 的子类型,则C 的列表实际上就是 A 的列表。(请注意,Haskell没有真正的子类型,但是具有“更多/更少多态”的相关概念“类型。)