在 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[]
数组创建工作。
我遇到了异常:[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[]
数组创建工作。