Можно создать дубликат:
Java Generics: Array containing genericsКак создать экземпляр массива Map.Entry <K, V> в Java?
У меня есть класс Java, который содержит 2 методы, которые добавляют и удаляют элемент из массива. Чтобы сделать его общим, требуется подтип, чтобы он мог работать с различными типами объектов.
Проблема заключается в том, что при создании экземпляра с помощью MapEntry (где MapEntry является реализацией java.util.Map.Entry) в качестве подтипа. Это приводит к исключению ClassCastException при попытке преобразовать массив Object в массив MapEntry. Я предполагаю, что это из-за следующих линий (где Т подтип):
array = (T[])(new Object[array.length + 1]);
array = (T[])(new Object[array.length - 1]);
которые используются для увеличения/уменьшения размера массива на 1 соответственно. Я также использую это на массивах целых чисел, строк и объектов, и он отлично работает с ними.
Кроме того, это явно указано, что мне нужно использовать массивы для этого, так что никаких списков и т.д.
Есть ли способ, чтобы обойти эту проблему, все еще держа класс как родовые, насколько это возможно?
Редактировать: Удалось решить проблему. Вот рабочий код:
array = (T[])Array.newInstance(array.getClass().getComponentType(), array.length + 1);
array = (T[])Array.newInstance(array.getClass().getComponentType(), array.length - 1);
Спасибо за помощь: D
Кастинг на 'T' не должен на самом деле ничего делать, по крайней мере, если параметр типа не связан. Не могли бы вы предоставить немного больше контекста? Типичная подпись вашего класса и способ его создания? – millimoose
Тем не менее, вы не можете иметь общие массивы и не должны пытаться это сделать. Я использую 'Object []' всюду и просто привожу при возврате значений в ваши методы - это все еще небезопасный актерский состав, но он немного локализован. (Или посмотрите, как «ArrayList» реализуется и делает это.) – millimoose