Поэтому я обычно знаю, как создать общий массив, который вы могли бы сделать:
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
}
}
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];
и подавить предупреждение, которое приходит.
Также см:
new Entrant<?, ?>[N]
если вы хотите избежать необработанных типов
Логика этого:
Каждый участник является объектом, но каждый объект не является участником. Смотрите, вы бросаете объекты в абитуриентов, которые не будут работать.
Object[]
не являетсяEntrant<K, V>[]
, поэтому вы получаетеClassCastException
. Посмотреть этот вопрос: stackoverflow.com/questions/1817524/generic-arrays-in-java?rq=1