Использование функции compareTo в универсальном классе в Java вызывает [Ljava.lang.Object; не может быть преобразован в [Ljava.lang .Comparable

#java #generics #comparable

#java #дженерики #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. Покажите нам полную трассировку стека и покажите, какая строка вызывает ошибку, поскольку номера строк в трассировке стека нам бесполезны.

2. Я впервые использую переполнение стека и не знаю, как выделить определенную строку. Однако внутри функции insert() compareTo() используется дважды, и я получаю исключения для них обоих.

3. Отредактируйте вопрос и покажите нам полную трассировку стека.

4. Обратите внимание, что вам не нужно присваивать null всем элементам массива. Элементам массива автоматически присваивается значение по умолчанию, а значение ссылочного типа по умолчанию равно null .

5. @mysticgirl здесь нет волшебства: просто добавьте // THIS LINE в соответствующем месте кода.

Ответ №1:

Поскольку удаление T is Comparable , not Object , вы не можете создать Object[] и преобразовать его в a T[] .

Comparable[] Вместо этого создайте a .

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

Однако на самом деле вам не нужно ограничивать свой класс естественно сопоставимыми типами: если вы также передаете a Comparator<? super T> в конструктор и сохраняете его в поле для использования при сравнении элементов, вы можете принять любой тип.

 array[currentIndex].compareTo(x)
  

Станет

 comparator.compare(array[currentIndex], x)
  

Это удалит верхнюю границу extends Comparable<T> T и позволит вашему Object[] созданию массива работать.