无法将Object强制转换为Comparable

时间:2014-12-06 21:32:26

标签: java arrays casting comparable

我试图订购二叉搜索树,并将其值存储在数组中,但是当我尝试将ArrayList转换为数组时,它表示我无法将Object转换为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());
}

错误讯息: 线程&#34; main&#34;中的例外情况java.lang.ClassCastException:[Ljava.lang.Object;无法转换为[Ljava.lang.Comparable;

编辑:解决了这个问题

public T[] postOrder() {
    ArrayList<T> array = new ArrayList<T>();
    postOrder(root, array);
    return array.toArray((T[]) Array.newInstance(root.getData().getClass(), size()));
}

2 个答案:

答案 0 :(得分:4)

  

[Ljava.lang.Object;无法转换为[Ljava.lang.Comparable;

这意味着您正在尝试将Object[]投射到Comparable[]。 (&#34; [L&#34;表示数组。)

toArray返回Object[]。您可能可以使用<T>toArray(T[])代替;但是,由于type erasure你无法做到

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

所以要么

  • 您的树需要Class<T>
  • 来电者需要传递T[]才能填写。
  • postOrder需要返回非泛型数组。 (Object[] ... Comparable[] ...)
  • 您应该返回List<T>而不是T[]

我注意到你正在使用@Override所以也许你的超类型(接口,超类)有关于如何实现这个方法的说明。 (即如果这是作业,你应该问你的导师,因为我不清楚你应该使用哪种解决方案。)

如果您碰巧有Class<T>,那么您可以

@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())
    );
}

否则您需要更改方法的签名。

另见

答案 1 :(得分:2)

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

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

结果的大小并不重要,只要确保以后不再使用传入的内容,因为如果大小不正确,可能会在toArray内重新分配,所以只使用postOrder的返回值。

如果您只是返回List<T>,请考虑将其转换为数组,这可能会更加清晰!请注意,返回List ...

需要多少解释
public List<T> postOrder() {
    ArrayList<T> array = new ArrayList<T>();
    postOrder(root, array);
    return array;
}