我知道有一个类似的quesion,但答案是告诉我如何执行,但没有原因。我还有另一种创建方式,但我不知道为什么
public class testForGeneric<T> {
public testForGeneric(T[] a) {
int len = a.length;
Node<T>[] nodes = new Node<T>[len];//THE PROBLEM!
for (int i = 0; i < len; i++)
nodes[i] = new Node<>(a[i], i);
}
public static void main(String[] args) {
Integer[] a = { 3, 2, 4 };
testForGeneric<Integer> t = new testForGeneric<>(a);
}
}
问题行的错误是:
无法创建Node的通用数组
如果将行更改为Node<T> nodes = new Node[len]
,那将是正确的。
但是您会得到警告:
类型安全:Node []类型的表达式需要未经检查的转换才能符合Node []
我不知道为什么这是正确的。Node[len]就像是一些普通数组。从警告中,为什么Node[]
可以转换为Node<T>[]
?
以及为什么数组中的元素应使用Node<>()
初始化?
如果您使用Object
数组强制转换为Node<T>[]
数组,那也是错误的。
Node.java
:
public class Node<T> {
public T val;
public int index;
public Node(T val, int index) {
this.index = index;
this.val = val;
}
public Node() {
}
}
这只是一般阵列的测试
我想知道为什么是对还是错。
答案 0 :(得分:0)
您无法在Java中创建泛型数组。
您会发现,像这样的简单语句甚至不会编译,因为Java编译器不允许这样做。要了解原因,您首先需要知道两个数组是协变的,而泛型是不变的。
协变量:这意味着您可以将子类类型数组分配给其超类数组引用。
不变:这意味着您不能将泛型子类类型分配给它的超类泛型引用,因为在泛型中,任何两个不同的类型既不是子类型也不是超类型。