2011-12-14 1 views
0

Можно создать дубликат:
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

+0

Кастинг на 'T' не должен на самом деле ничего делать, по крайней мере, если параметр типа не связан. Не могли бы вы предоставить немного больше контекста? Типичная подпись вашего класса и способ его создания? – millimoose

+0

Тем не менее, вы не можете иметь общие массивы и не должны пытаться это сделать. Я использую 'Object []' всюду и просто привожу при возврате значений в ваши методы - это все еще небезопасный актерский состав, но он немного локализован. (Или посмотрите, как «ArrayList» реализуется и делает это.) – millimoose

ответ

1

A) не использовать массивы, они ужасны. Вместо этого используйте коллекции.

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

T[] array = Array.newInstance(type, length); 

Read:

+0

A) Как указано в проблеме, я делаю это для задания, и в нем явно указано, что я должен использовать массивы :( B) Не могли бы вы рассказать об этом? Если вам нужно знать тип массива для создания массива, разве это не уберет всю точку дженериков? – PandaConda

+0

@ user1097658 да, но, к сожалению, Java generics работают именно так. Читайте: http://docs.oracle.com/javase/tutorial/java/generics/erasure.html –

+0

Это помогло мне решить проблему. См. Мое редактирование в вопросе. Спасибо: P – PandaConda

0

T[] массив является подклассом Object[], и вы можете отличить T[] до Object[]. Но обратное неверно: вы не можете наложить Object[] на T[], потому что Object[] не является подклассом T[].

Я думаю, что ваш вопрос сводится к How to create an array of a generic type?

Смежные вопросы