创建自定义对象数组的数组

时间:2014-05-03 13:32:32

标签: java arrays jagged-arrays

我在创建包含自定义对象数组的数组时遇到了麻烦。

我想将容器创建为可比数组的标准数组,原因有多种:

  • 其中包含的每个自定义对象数组必须是不同的长度
  • 自定义对象数组具有内置的自动排序工具,不适合我希望它们适合的较大的包含数组

自定义对象数组可以正常运行并经过全面测试。

我在创建较大对象时收到的异常是:

线程中的异常" 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将此Object数组视为Object而不是Object数组。我认为这是一种锯齿状数组,但如上所述,它不能由相同类型的数组组成,因为它会导致其他问题。请帮忙。

3 个答案:

答案 0 :(得分:3)

只需将有问题的行改为:

// Unchecked Casting
data = (SortedFixedCircularArray<E>[]) new SortedFixedCircularArray[height];

演员阵容是可选的,这也有效:

data = new SortedFixedCircularArray[height];

基本上混合泛型和数组是一个坏主意。

答案 1 :(得分:2)

您可以尝试使用通用列表来索引所有对象,然后只使用for-each循环来调用和测试它们,但是我不知道这是否适合您。
我很确定这是因为你没有从SortedFixedCircularArray派生Comparable类,反过来又导致你无法转换那种类型的对象然后将它引用到Comparable
你可以试试这个:

`class SortedFixedCircularArray<E> extends Comparable<E> {
     //In Which This Should Now Work:
     data = (SortedFixedCircularArray<E>[]) new Comparable[height];
}  
`

问题也可能是你引用了一个可比较的数组而不是&lt;&gt;,这也会导致一个强制转换异常。

我希望这有助于:)

答案 2 :(得分:0)

您无法将Comparable对象强制转换为SortedFixedArray,而您可以将SortedFixedArray强制转换为Comparable。 所以你可以使用:

data = new SortedFixedCircularArray<E>[height];

你会遇到同样的问题
private E[] newArray(int size) {
  return (E[]) new Comparable[size];
}

为什么不做 new E[size]