如何创建泛型类数组?(非泛型数组!)

时间:2019-04-19 12:18:59

标签: java generics

我知道有一个类似的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() {
    }
}

这只是一般阵列的测试

我想知道为什么是对还是错。

1 个答案:

答案 0 :(得分:0)

您无法在Java中创建泛型数组。

  

您会发现,像这样的简单语句甚至不会编译,因为Java编译器不允许这样做。要了解原因,您首先需要知道两个数组是协变的,而泛型是不变的。

     

协变量:这意味着您可以将子类类型数组分配给其超类数组引用。

     

不变:这意味着您不能将泛型子类类型分配给它的超类泛型引用,因为在泛型中,任何两个不同的类型既不是子类型也不是超类型。

Source