【发布时间】:2019-12-15 16:35:46
【问题描述】:
想象一下这两个示例代码:
public class TestCompile<T> {
private T[] array;
public static void main(String[] args) {
}
}
public class TestNoCompile<T> {
private T[] array = new T[5];
public static void main(String[] args) {
}
}
第一个类TestCompile在编译时没有错误,第二个TestNoCompile无法编译。
我明白为什么第二个不能编译,因为 Java 中的数组是协变的,并且类型擦除与它不兼容。但我不明白为什么第一个示例编译,如果我不能初始化它,为什么我可以声明一个泛型数组?
另一方面,我不能不了解另一个例子:
public class Example<T> {
private T[] array;
public static void main(String[] args) {
Example<Integer> example = new Example<>();
example.method(new Integer[5]);
}
public void method(T[] array) {
array[0] = 1; //This line doesnt compile.
}
在这里,我似乎能够在方法 method(...) 中初始化一个通用数组,但是我无法在其中存储任何值。这种行为的解释是什么?
【问题讨论】:
-
编译器此时无法推断 T 的类型。分配 1 你说它是一个数字,它不可能是真的,例如,如果你做 Example
example = new Example(); -
问题的第一部分与How to create a generic array in Java?重复
标签: java arrays generics type-erasure