Java 无法将对象强制转换为可比较对象

Java 无法将对象强制转换为可比较对象,java,arrays,casting,comparable,Java,Arrays,Casting,Comparable,我试图对二叉搜索树进行排序,并将其值存储在数组中,但当我尝试将ArrayList转换为array时,它表示无法将对象转换为Comparable @Override public T[] postOrder() { ArrayList<T> array = new ArrayList<T>(); postOrder(root, array); return (T[]) array.toArray(); } private void postOrde

我试图对二叉搜索树进行排序,并将其值存储在数组中,但当我尝试将ArrayList转换为array时,它表示无法将对象转换为Comparable

@Override
public T[] postOrder() {
    ArrayList<T> array = new ArrayList<T>();
    postOrder(root, array);
    return (T[]) array.toArray();
}

private void postOrder(BSTNode<T> currRoot, ArrayList<T> array) {
    if (currRoot == null)
        return;
    if (!currRoot.getLeft().isEmpty())
        postOrder((BSTNode<T>) currRoot.getLeft(), array);
    if (!currRoot.getRight().isEmpty())
        postOrder((BSTNode<T>) currRoot.getRight(), array);
    array.add(currRoot.getData());
}
@覆盖
公共T[]邮购(){
ArrayList数组=新的ArrayList();
后序(根、数组);
return(T[])array.toArray();
}
私有void postOrder(BSTNode currRoot、ArrayList数组){
if(currRoot==null)
返回;
如果(!currRoot.getLeft().isEmpty())
postOrder((BSTNode)currRoot.getLeft(),数组);
如果(!currRoot.getRight().isEmpty())
postOrder((BSTNode)currRoot.getRight(),数组);
add(currRoot.getData());
}
错误消息: 线程“main”java.lang.ClassCastException中的异常:[Ljava.lang.Object;无法转换为[Ljava.lang.Compariable

编辑:这样解决

public T[] postOrder() {
    ArrayList<T> array = new ArrayList<T>();
    postOrder(root, array);
    return array.toArray((T[]) Array.newInstance(root.getData().getClass(), size()));
}
public T[]postOrder(){
ArrayList数组=新的ArrayList();
后序(根、数组);
返回array.toArray((T[])array.newInstance(root.getData().getClass(),size());
}

通用数组很乱,您需要调用另一个
toArray()
方法:

public T[] postOrder(T[] result) {
    ArrayList<T> array = new ArrayList<T>();
    postOrder(root, array);
    return array.toArray(result);
}
[Ljava.lang.Object;不能强制转换为[Ljava.lang.Compariable

这意味着您正试图将
对象[]
强制转换为
可比[]
(“
[L
”表示数组。)

返回
对象[]
。您可以改为使用;但是,由于

//                  cannot do
//                    vvvvv
return array.toArray( new T[ mySize ] );
所以

  • 您的树需要一个
  • 调用方需要传递一个
    T[]
    来填充
  • postOrder
    需要返回非泛型数组。(
    Object[]
    ..
    Comparable[]
    ..)
  • 您应该返回一个
    列表,而不是
    T[]
我注意到您正在使用
@Override
,因此您的超类型(接口、超类)可能有关于如何实现此方法的说明。(例如,如果这是家庭作业,您应该询问您的讲师,因为我不清楚您应该使用哪种解决方案。)

如果您碰巧有一个
,那么您可以这样做

@Override
public T[] postOrder() {
    ArrayList<T> array = new ArrayList<T>();
    postOrder(root, array);
    return (T[]) array.toArray(
        java.lang.reflect.Array.newInstance(myClassT, array.size())
    );
}
@覆盖
公共T[]邮购(){
ArrayList数组=新的ArrayList();
后序(根、数组);
return(T[])array.toArray(
java.lang.reflect.Array.newInstance(myClassT,Array.size())
);
}
否则,您需要更改方法的签名

另见


非常详细的解释,但没有解决方案…我的正好相反:)@TWiStErRob OP使用了
@Override
,因此他们显然无法更改方法签名。就个人而言,我不确定该告诉他们什么。我在我的代码中使用了
@Override
,但我也定义了接口。即使他无法修改接口可以像引用的问题一样在构造函数中传递
实例!@TWiStErRob没错,它可能是OP自己的接口。
@Override
public T[] postOrder() {
    ArrayList<T> array = new ArrayList<T>();
    postOrder(root, array);
    return (T[]) array.toArray(
        java.lang.reflect.Array.newInstance(myClassT, array.size())
    );
}