Создание массива массивов пользовательских объектов
У меня проблемы с созданием массива для хранения пользовательских массивов.
Я хочу создать контейнер как стандартный массив сопоставимых массивов по нескольким причинам:
- Каждый массив пользовательских объектов, содержащийся внутри, должен иметь различную длину
- Массив пользовательских объектов имеет встроенные инструменты автоматической сортировки, которые не подходят для большого содержащего массива, в который я хочу, чтобы они помещались
Пользовательский массив объектов работает и был тщательно протестирован.
Исключение, которое я получаю при создании более крупного объекта:
Исключение в потоке "main" java.lang.ClassCastException:
[Ljava.lang.Comparable; невозможно привести к [LSortedFixedCircularArray;
Вот применимый код
//From SortedFixedCircularArray.java
public class SortedFixedCircularArray<E extends Comparable<E>>
{
SortedFixedCircularArray(int fixed_capacity_in)
{
data = newArray(fixed_capacity_in);
front = 0;
rear = 0;
size = 0;
capacity = data.length;
}
@SuppressWarnings("unchecked")
private E[] newArray(int size)
{
return (E[]) new Comparable[size];
}
}
//From CCArray.java
public class CCArray <E extends Comparable<E>>
{
private SortedFixedCircularArray<E>[] data;
private long size;
private long capacity;
private final static long DEFAULT_CAPACITY = 15;
CCArray()
{
this(DEFAULT_CAPACITY);
}
@SuppressWarnings("unchecked")
CCArray(long initial_capacity)
{
int height = getIndices(initial_capacity)[0]+1;
height *= 2;
//!THIS IS THE PROBLEM LINE!
data = (SortedFixedCircularArray<E>[]) new Comparable[height]; //Unchecked Casting
int temp = (height/2)-1;
patternInit(temp);
capacity = initial_capacity;
size = 0;
}
private void patternInit(int height_in)
{
//initialize the individual arrays here
}
private int[] getIndices(long index)
{
//Return int[] with i&j indices
}
}
Я предполагаю, что Java видит этот массив объектов как объект, а не массив объектов. Я думаю, что это тип зубчатого массива, но, как указано выше, он не может состоять из массива того же типа, что и вызывает другие проблемы. Пожалуйста помоги.
3 ответа
Просто измените свою проблемную строку на это:
// Unchecked Casting
data = (SortedFixedCircularArray<E>[]) new SortedFixedCircularArray[height];
Приведение является необязательным, это также работает:
data = new SortedFixedCircularArray[height];
По сути, это плохая идея смешивать Generics и Arrays.
Вы можете попробовать использовать общий список для индексации всех ваших объектов, а затем просто использовать цикл for-each для их вызова и тестирования, однако я не знаю, является ли это желательным для вас.
Я вполне уверен, что это потому, что вы не получили класс Comparable из вашего SortedFixedCircularArray и, в свою очередь, приводят к тому, что вы не можете привести объект такого типа к другой, а затем сослаться на Comparable.
Вы можете попробовать это:
`class SortedFixedCircularArray<E> extends Comparable<E> {
//In Which This Should Now Work:
data = (SortedFixedCircularArray<E>[]) new Comparable[height];
}
`
Проблема также может заключаться в том, что вы ссылаетесь на сопоставимый массив, а не на <>, что также приведет к исключению приведения.
Надеюсь, это поможет:)
Вы не можете преобразовать Comparable объект в SortedFixedArray, в то время как вы можете преобразовать SortedFixedArray в Comparable. Таким образом, вы можете использовать:
data = new SortedFixedCircularArray<E>[height];
У вас будет такая же проблема для
private E[] newArray(int size) {
return (E[]) new Comparable[size];
}
Почему бы тебе просто не сделатьnew E[size]
?