繁体   English   中英

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

[英]Creating an Array of Custom Object Arrays

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

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

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

自定义对象数组有效并且已经过全面测试。

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

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

只需将您有问题的行更改为此:

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

强制转换是可选的,这也可以:

data = new SortedFixedCircularArray[height];

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

您可以尝试使用通用列表来索引所有对象,然后仅使用for-each循环来调用和测试它们,但是我不知道这是否对您理想。
我可以肯定地说是因为您没有从SortedFixedCircularArray派生Comparable类,从而导致您无法转换该类型的对象,然后将其引用到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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM