我面临一个例外:[Ljava.lang.Object;无法转换为[Ljava.lang.Comparable;我尝试在我的泛型类中使用compareTo函数。
这是我的代码,我在insert()函数中遇到了这个问题:
public class BinaryTreeArray<T extends Comparable<T>>{
T[] array;
int level, count;
final int capacity;
public BinaryTreeArray(int size)
{
capacity=size;
array=(T[]) new Object[capacity];
for(int i=0; i<capacity; i++)
array[i]=null;
}
public BinaryTreeArray(T val, int size) //val is the root in this case
{
capacity=size;
array=(T[]) new Object[capacity];
array[0]=val;
count=0;
for(int i=1; i<capacity; i++)
array[i]=null;
}
public void insert(T x)
{
int currentIndex = 0;
System.out.println("Adding: "+x);
while(true) {
if(array[currentIndex]==null)
{
array[currentIndex]=x;
System.out.println(" Inserted at index: "+currentIndex);
break;
}
else if(array[currentIndex].compareTo(x)<=0)
{
if(array[currentIndex] == x){
System.out.println("ERROR!-- Repeating element" );
break;
}else
System.out.print(" Right ");
currentIndex =(2*currentIndex) + 2;
}
else if(array[currentIndex].compareTo(x)>=0)
{
if(array[currentIndex] == x){
System.out.println( "ERROR!-- Repeating element");
break;
}else
System.out.println(" Left ");
currentIndex=1+(2 * currentIndex);
}
}
}
}
任何帮助将不胜感激。谢谢。
答案 0 :(得分:1)
由于T
的删除是Comparable
,而不是Object
,因此您无法创建Object[]
并将其转换为T[]
。
改为创建Comparable[]
。
array=(T[]) new Comparable[capacity];
但是,您并不需要将类限制为自然可比较的类型:如果您还将Comparator<? super T>
传递给构造函数,并将其存储在字段中以便在比较元素时使用,则可以接受任何类型。
array[currentIndex].compareTo(x)
会变成
comparator.compare(array[currentIndex], x)
这将从extends Comparable<T>
中删除上限T
,并允许您的Object[]
数组创建工作。