我在创建包含自定义对象数组的数组时遇到了麻烦。
我想将容器创建为可比数组的标准数组,原因有多种:
自定义对象数组可以正常运行并经过全面测试。
我在创建较大对象时收到的异常是:
线程中的异常" 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数组。我认为这是一种锯齿状数组,但如上所述,它不能由相同类型的数组组成,因为它会导致其他问题。请帮忙。
答案 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]
?