#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[]
созданию массива работать.