Как создать массив пользовательского класса, который содержит дженерики в Java - PullRequest
1 голос
/ 18 февраля 2020

У меня есть задание, цель которого - создать реализацию HashTable с общими ключами и значениями c. Для обработки столкновений нам сказали использовать отдельную цепочку. Итак, я попытался сделать это:

public class HashTable<K, V> implements Table<K, V> {

    private Node[] generics;

    public class Node {

        V value;
        Node next;

        public Node(V val) {
            value = val;
        }

    }

    public HashTable(int size) {
        generics = (Node[]) new Object[size];
    }

}

Для отдельной цепочки я хотел использовать реализацию связанного списка (что еще), поэтому мне нужно generics для хранения Node, не только V. Причина, по которой я не могу просто написать generics = new Node[size];, заключается в том, что класс Node содержит generi c, и создание массива generi c не допускается. Для этого назначения приемлем обходной путь, который выдает предупреждение «unchecked cast».

Затем в драйвере он пытается Table<String, String> ht = new HashTable<String, String>(5); и получает ClassCastException. Не было ClassCastException, когда generics было V[] для контекста.

Итак, мой вопрос: как мне создать собственный массив классов, где пользовательский класс содержит обобщенные типы (без изменения драйвера)

1 Ответ

0 голосов
/ 18 февраля 2020

Попробуйте приведенное ниже решение

public class HashTable<K, V> {
    private Node<V>[] generics;

    static class Node<V> {
        V value;
        Node next;
        public Node(V val) {
            value = val;
        }
    }
    private HashTable(int size) {
        generics = (Node<V>[]) new Node[size];
    }
}

generics = (Node []) new Node [size]; эта строка выдаст вам непроверенное предупреждение о приведении для этого кода, включая проверку исходного кода HashMap

И если вы хотите удалить непроверенное предупреждение о приведении, чем подстановочный знак в обобщенном c указателе типа

 public class HashTable<K, V> {
    private Node<?>[] generics;

    static class Node<V> {
        V value;
        Node next;
        public Node(V val) {
            value = val;
        }
    }
    public HashTable(int size) {
        generics = new Node<?>[size];
    }
 }

это не даст вам никакого предупреждения "непроверенный актерский состав". для этого вы можете исходный код HashTable

...