在泛型类中使用compareTo函数

时间:2016-10-01 12:29:31

标签: java generics comparable

我面临一个例外:[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);
    }

  }
 }
}

任何帮助将不胜感激。谢谢。

1 个答案:

答案 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[]数组创建工作。