在 Java 中的通用 class 中使用 compareTo 函数会导致 [Ljava.lang.Object;无法转换为 [Ljava.lang.Comparable

Using compareTo function in a generic class in Java causes [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable

我遇到了异常:[Ljava.lang.Object;不能转换为 [Ljava.lang.Comparable;当我尝试在我的通用 class.

中使用 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);
    }

  }
 }
}

如有任何帮助,我们将不胜感激。谢谢。

由于 T 的擦除是 Comparable,而不是 Object,因此您无法创建 Object[] 并将其转换为 T[]

改为创建 Comparable[]

array=(T[]) new Comparable[capacity];

但是,您实际上并不需要将 class 限制为自然可比较的类型:如果您还将 Comparator<? super T> 传递给构造函数,并将其存储在一个字段中以供您使用比较元素,你可以接受任何类型。

array[currentIndex].compareTo(x)

会变成

comparator.compare(array[currentIndex], x)

这将从 T 中删除上限 extends Comparable<T>,并允许您的 Object[] 数组创建工作。