Создание массива массивов пользовательских объектов

У меня проблемы с созданием массива для хранения пользовательских массивов.

Я хочу создать контейнер как стандартный массив сопоставимых массивов по нескольким причинам:

  • Каждый массив пользовательских объектов, содержащийся внутри, должен иметь различную длину
  • Массив пользовательских объектов имеет встроенные инструменты автоматической сортировки, которые не подходят для большого содержащего массива, в который я хочу, чтобы они помещались

Пользовательский массив объектов работает и был тщательно протестирован.

Исключение, которое я получаю при создании более крупного объекта:

Исключение в потоке "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]?

Другие вопросы по тегам