У меня есть следующий код, который объединяет два массива и должен обрабатывать любые типы, кроме примитивов.Java создать массив из общего типа времени выполнения другого массива
@SuppressWarnings("unchecked")
public static synchronized <E> E[] aryMergeNoDup(E[]... arys){
HashSet<E> hs = new HashSet<E>();
for(E[] ary : arys) {
if(ary == null) continue;
for(E item : ary) {
if(item != null) hs.add(item);
}
}
hs.remove(null);
return hs.toArray((E[]) Array.newInstance(
arys.getClass().getComponentType(),hs.size()));
}
Однако при выполнении кода он генерирует это исключение:
java.lang.ArrayStoreException: java.lang.String
at java.util.AbstractCollection.toArray(AbstractCollection.java:188)
at util.Utils.aryMergeNoDup(Utils.java:197)
Тип выполнения переменной arys
является String []; однако, когда я заменяю arys.getClass().getComponentType()
кодом String.class
, код работает нормально.
Однако этот метод может использоваться только для строк, потому что это pf. Я не вижу, что происходит неправильно, так как они должны ссылаться на java.lang.String
.
Строка в AbstractCollection.java:188, что бросает исключение составляет:
r[i] = (T)it.next();
public <T> T[] toArray(T[] a) {
// Estimate size of array; be prepared to see more or fewer elements
int size = size();
T[] r = a.length >= size ? a :
(T[])java.lang.reflect.Array
.newInstance(a.getClass().getComponentType(), size);
Iterator<E> it = iterator();
for (int i = 0; i < r.length; i++) {
if (! it.hasNext()) { // fewer elements than expected
if (a != r)
return Arrays.copyOf(r, i);
r[i] = null; // null-terminate
return r;
}
r[i] = (T)it.next();
}
return it.hasNext() ? finishToArray(r, it) : r;
}
arys.getClass(). GetComponentType(). GetComponentType() работает с удовольствием! – user1467885