Java 无法将对象强制转换为可比较对象
我试图对二叉搜索树进行排序,并将其值存储在数组中,但当我尝试将ArrayList转换为array时,它表示无法将对象转换为ComparableJava 无法将对象强制转换为可比较对象,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
@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())
);
}
否则,您需要更改方法的签名
另见
@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())
);
}