Java 中数组和泛型的类型规则
Type rules of arrays and generics in Java
Effective Java(第 2 项)第 25 项的最后一段说:
Arrays and generics have very different type rules. Arrays are covariant and reified; generics are invariant and erased.
有人可以更好地定义 Java 中与数组和泛型相关的粗体术语吗?我也不介意一些例子。
如果您对某个特定概念感到困惑,您没有提及,所以我将尝试给出 协方差 和 不变性的基本定义.
Covariance 保留类型排序,invariance 不保留。这意味着保留或不保留子类型(在 逆变 的情况下反转)。
所以,如果你有以下 class
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);
换句话说,数组类型暴露给运行时或具体化。
对于不变类型(例如泛型),子类型不会被保留。因此,例如 X<B>
除了 X
与 X<A>
没有类型关系。这部分是由于泛型类型未暴露给运行时或 erased.
但是,您仍然可以使用 extends
和 super
分别。例如 class
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);
Effective Java(第 2 项)第 25 项的最后一段说:
Arrays and generics have very different type rules. Arrays are covariant and reified; generics are invariant and erased.
有人可以更好地定义 Java 中与数组和泛型相关的粗体术语吗?我也不介意一些例子。
如果您对某个特定概念感到困惑,您没有提及,所以我将尝试给出 协方差 和 不变性的基本定义.
Covariance 保留类型排序,invariance 不保留。这意味着保留或不保留子类型(在 逆变 的情况下反转)。
所以,如果你有以下 class
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);
换句话说,数组类型暴露给运行时或具体化。
对于不变类型(例如泛型),子类型不会被保留。因此,例如 X<B>
除了 X
与 X<A>
没有类型关系。这部分是由于泛型类型未暴露给运行时或 erased.
但是,您仍然可以使用 extends
和 super
分别。例如 class
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);