您没有提到您是否对某个特定概念感到困惑,因此我将尝试仅给出协方差和不变性的基本定义。 p>
Covariance 保留类型顺序,invariance 不保留。这意味着子类型被保留或不被保留(在 逆变 的情况下反转)。
所以,如果你有以下课程
public class A {
public void go() {
System.out.println("A");
}
}
还有……
public class B extends A {
@Override
public void go() {
System.out.println("B");
}
}
使用协变类型(例如数组),函数
public static void go(A[] as) {
for (A a : as)
a.go();
}
完全有效的用作
A[] as = new A[8];
B[] bs = new B[8];
go(as);
go(bs);
换句话说,数组类型暴露给运行时或reified。
对于不变类型(例如泛型),不保留子类型。因此,例如,X<B> 除了X 之外,与X<A> 没有类型关系。这部分是泛型类型没有暴露给运行时或擦除的结果。
但是,您仍然可以分别使用extends 和super 在Java 中明确表达协方差 和逆变。例如类
public class X<T extends A> {
private T t_;
public X(T t) {
t_ = t;
}
public void go() {
t_.go();
}
}
功能
public static void go(X<?> x) {
x.go();
}
将有效地用作
X<A> xa = new X<A>(a);
X<B> xb = new X<B>(b);
go(xa);
go(xb);