gpt4 book ai didi

java - 无法将对象转换为可比对象

转载 作者:行者123 更新时间:2023-12-02 00:33:51 26 4
gpt4 key购买 nike

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

错误信息:线程“main”中的异常 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()));
}

最佳答案

[Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable;

这意味着您正在尝试转换 Object[]Comparable[] 。 (“[L ”表示数组。)

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所以也许你的父类(super class)型(接口(interface)、父类(super class))有关于如何实现这个方法的说明。 (即,如果这是家庭作业,您应该询问您的老师,因为我不清楚您应该使用哪种解决方案。)

如果您碰巧有 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())
);
}

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

另请参阅

关于java - 无法将对象转换为可比对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27336794/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com