Как создать универсальный массив классов? (Не универсальный массив!) - PullRequest
0 голосов
/ 19 апреля 2019

Я знаю, что есть похожий вопрос , но ответ говорит мне, как это сделать, но не причина. И у меня есть другой способ создать, но я не знаю почему

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<T> nodes = new Node[len], это будет правильно.Но вы получите предупреждение:

Безопасность типов: выражение 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 голосов
/ 19 апреля 2019

Вы не можете создать массив обобщений в Java.

Вы обнаружите, что такое простое утверждение даже не будет компилироваться, потому что компилятор Java этого не позволяет.Чтобы понять причину, вам сначала нужно знать, что два массива ковариантны, а обобщенные типы инвариантны.

Ковариант : это означает, что вы можете назначить массив типа подкласса для его ссылки на массив суперкласса.

Инвариант : Это означает, что вы не можете назначить универсальный тип подкласса для его универсальной ссылки суперкласса, поскольку в универсальных форматах любые два различных типа не являются ни подтипом, ни супертипом.

Источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...