我试图订购二叉搜索树,并将其值存储在数组中,但是当我尝试将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()));
}
答案 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;
}