Java - Создание массива объекта с общими параметрами

1

Поэтому я обычно знаю, как создать общий массив, который вы могли бы сделать:

E[] e = (E[]) new Object[10]; 

Однако у меня есть класс Entrant<K, V> который имеет два общих параметра. Кажется, я не могу использовать массив Object для него.

Вот полный код и ошибка во время выполнения

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [LHashTable.Entrant;
    at HashTable.HashTable.<init>(HashTable.java:10)
    at Mainy.map(Mainy.java:32)

строка 32 в Майни:

HashTable h = new HashTable();

Код Hashtable:

public class HashTable<K, V> {

    Entrant<K, V>[] _entrants;
    private static final int N = 16;

    public HashTable() {
        _entrants = (Entrant<K, V>[]) new Object[N]; //line 10
    }

}
  • 2
    То, что вы пытаетесь сделать, не работает. Object[] не является Entrant<K, V>[] , поэтому вы получаете ClassCastException . Посмотреть этот вопрос: stackoverflow.com/questions/1817524/generic-arrays-in-java?rq=1
  • 0
    также .. Пожалуйста, следуйте стандартным соглашениям об именах Java - например, camelCase
Теги:
generics
arrays

2 ответа

4

Object[] Cast Object[] to E[] не гарантированно работает, когда вы выставляете массив вне вашего класса. Casting работает в конструкторе, потому что тип параметра E стирается до Object, и литье фактически эквивалентно:

Object[] e = (Object[]) new Object[10]; 

Однако предположим, что ваш класс HashTable предоставляет массив K[]:

class HashTable<K, V> {

    K[] _entrants;
    private static final int N = 16;

    public HashTable() {
        _entrants = (K[]) new Object[N]; //line 10
    }

    public K[] getEntrants() {
        return _entrants;
    }
}

И вы создаете его экземпляр и получаете от него абитуриентов:

HashTable<String, String> hashTable = new HashTable<>();
String[] entrants = hashTable.getEntrants();

Этот код будет генерировать ClassCastException во втором назначении.

В то время как в случае параметризованного массива типов, кастинг завершится неудачно, поскольку он будет удален:

_entrants = (Entrant[]) new Object[N]; //line 10

Очевидно, что Object[] не является Extrant[]. Так что это не сработает. Вместо того, чтобы делать бросок, вы можете напрямую создать массив типа raw:

_entrants = new Entrant[N];

и подавить предупреждение, которое приходит.

Также см:

  • 0
    или new Entrant<?, ?>[N] если вы хотите избежать необработанных типов
0

Логика этого:

Каждый участник является объектом, но каждый объект не является участником. Смотрите, вы бросаете объекты в абитуриентов, которые не будут работать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню